-2

私の問題は、ユーザーがデータベースへのログオンに失敗した場合にトーストを作成するためにトレイを作成しているのに、ユーザーがデータベースへのログインに成功した場合でもトーストが表示されること Login_layoutです。

 class BuatLogin extends AsyncTask<String,  String , String> {

    /**
     * Sebelum memasuki menu buat progres dialog
     * */
    @Override
    protected void onPreExecute() {
      super.onPreExecute();
      pDialog = new ProgressDialog(Login_layout.this);
      pDialog.setMessage("Login_layout Progress...");
      pDialog.setIndeterminate(false);
      pDialog.setCancelable(true);
      pDialog.show();
    }
    /**
     * Konkesi
     * */
    protected String doInBackground(String... args) {
      String usr = user.getText().toString();
      String pwd = pass.getText().toString();

      Log.d("1 "+usr, pwd);
      // Building Parameters
      List<NameValuePair> params = new ArrayList<NameValuePair>();
      params.add(new BasicNameValuePair("usr", usr));
      params.add(new BasicNameValuePair("pwd", pwd));
      Log.d("2 "+usr, pwd);
      Log.d(usr,url_create_login);

      // getting JSON Object
      // login url menerima POST method
      JSONObject json = jsonParser.makeHttpRequest(url_create_login,
                                                   "POST", params);

      // cek log untuk response
      Log.d("Buat Respond", json.toString());

      // check untuk sukses tag
      try {
        int sukses = json.getInt(TAG_SUKSES);

        if (sukses == 1) {
          String nim=json.getString(TAG_NIM);
          Log.d(TAG_NIM,nim);

          // sukses login
          Intent i = new Intent(getApplicationContext(), Mhs_main_layout.class);
          i.putExtra(TAG_NIM, nim);
          startActivity(i);

          // tutup layar
          finish();
        } else if(sukses == 2) {
          String nim=json.getString(TAG_NIM);
          Log.d(TAG_NIM,nim);
          Intent i = new Intent(getApplicationContext(), Admin_main_layout.class);
          i.putExtra(TAG_NIM, nim);
          startActivity(i);

          // tutup layar ini
          finish();
        }else if(sukses == 3){

             setResult(100);


        }
      } catch (JSONException e) {
        e.printStackTrace();
      }

      return null;     
    }   

  }


  protected void onPostExecute(String file_url) {       
  int resultCode = 100;
        if (resultCode == 100) {
    Toast.makeText(Login_layout.this, "Nip/Nim Atau Password TIdak Sesuai Silahkan Coba            Lagi ", Toast.LENGTH_LONG).show();
         }
pDialog.dismiss();

  }

}}

4

2 に答える 2

0

何を、いつ、どのように達成しようとしているのかを理解するのは難しいです。とにかく、それreturn null"はそこにひどく悪いように見えます。

実行後に役立つ情報を返す必要があります。たぶんそこで、結果が期待どおりかどうかを確認できます。

関数が「ランダムな」結果を返すことはありません。いくつかのOOPやJavaを再学習してみてください。確かに「null」を返し、その関数をプログラムして。を返しますString

それを言った後...onPostExecuteビューにアクセスできるので 、トーストメッセージを生成するコードを書く必要があります。

編集 logcatはこの行にエラーを言っていますToast.makeText(Login_layout.this...か?よく書かれているかどうかはわかりません。v.getContext()Some1コメントしてくださいが、代わりに書くべきだと思いますLogin_layout.this

于 2013-03-17T22:47:03.057 に答える
0

onProgressUpdate(Progress...values)あなたはまさにあなたが望むもののために作られた方法を使うことができます。でdoInBackground()、電話publishProgress(Progress...values)してToastそこに行きます。

そしてところで:コード品質、オブジェクト指向プログラミングについての本を読むことを検討してください、そしてあなたがそれにいる間、AndroidAPIドキュメントを読んでください。

編集/追加

ベーシスAsyncTaskの概要(そして覚えておいてください、あなたはで新しいものThreadを始めていますAsyncTask

public class Operation extends AsyncTask<ParamA, ParamB, ParamC> {
    @Override
    protected ParamC doInBackground(ParamA... params) {
        return new ParamC();
    }      

    @Override
    protected void onPostExecute(ParamC result) {

    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected void onProgressUpdate(ParamB... values) {

    }
}  

ここでParamAParamBおよびParamCは、何がどこで使用されているかを示すための単なるクラスです。

private class ParamA { }
private class ParamB { }
private class ParamC { }

によって操作を実行するとnew Operation().execute(new ParamA());、firstonPreExcuteが呼び出され、必要になる可能性のあるいくつかの変数(接続の設定など)がインスタンス化されます。次に、の指定さexecuteれたパラメータがのパラメータとして配置されdoInBackgroundます。それが終了すると、return fromdoInBackgroundはparamとしてに渡されonPostExecute、そこで結果を表示できます。

ではdoInBackground、結果をUIスレッドに公開できます。からUIスレッドを直接呼び出すことはできないため、ショートカットはで使用publishProgressされています(は、UIスレッドで実行されない別のスレッドであるため)。doInBackgrounddoInBackgroundAsyncTaskThread

実際の有用な例

import java.util.Random;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class AsyncTaskActivity extends Activity implements OnClickListener {
    private Button button;
    private LinearLayout linearLayout;
    private TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        button = new Button(this);
        button.setText("Click to start operation");
        textView = new TextView(this);
        textView.setText("NOT STARTED YET");
        linearLayout.addView(button);
        linearLayout.addView(textView);
        setContentView(linearLayout);
        button.setOnClickListener(this);
    }

    public void onClick(View view){
        if (view == button)
            new LongOperation().execute("Hello");
    }

    private class LongOperation extends AsyncTask<String, Integer, Double> {
        @Override
        protected Double doInBackground(String... params) {
            for(int i = 1; i < params[0].length(); i++) {
                try {
                    Thread.sleep(2000);
                    publishProgress(i, i*i); //proper way to publish results while task is running.
                } 
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return new Random().nextDouble();
        }      

        @Override
        protected void onPostExecute(Double result) {
            textView.setText("Done: random result is " + result);
        }

        @Override
        protected void onPreExecute() {
            Toast.makeText(AsyncTaskActivity.this, "onPreExcecute", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            textView.setText("We just slept for a total of " + (values[0] * 2) + " seconds,  (and btw: " + values[0] + " to the power of 2 is " + values[1] + ").");
        }
    }   
}

Threadsこのコードを使用して、他の(または)のUIスレッドにアクセスすることもできdoInBackgroundます(ただし、回避する必要があります)。

AsyncTaskActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        textView.setText("Called the UI from Thread");
    }
});
于 2013-03-17T22:52:46.260 に答える