在asynctask中制作吐司时出错

时间:2013-03-17 22:22:16

标签: android android-asynctask

我的问题是,如果用户未能在数据库上进行操作,我就会进行吐司,但即使用户在我的数据库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();

  }

} }

2 个答案:

答案 0 :(得分:0)

很难理解你想要实现的目标,时间和方式。无论如何,那里return null"看起来非常糟糕。

您应该返回一些有用的信息来发布执行。也许在那里你可以检查结果是否是预期的结果。

函数永远不应返回“随机”结果。 你应该尝试重新学习一些OOP和/或java。 您肯定会返回“null”,并且您已编程该函数以返回String

说完后...... 您应该编写代码以在onPostExecute中生成Toast消息,因为它可以访问视图。

修改 logcat是否在此行Toast.makeText(Login_layout.this...中说错误? 我不确定它是否写得好。 Some1请评论,但我认为你应该写v.getContext()而不是Login_layout.this

答案 1 :(得分:0)

您可以使用onProgressUpdate(Progress...values)方法,该方法完全符合您的要求。在doInBackground()中,拨打publishProgress(Progress...values)并在那里Toast

顺便说一句:请考虑阅读有关代码质量,面向对象编程的书籍,并在阅读时,阅读Android API文档。

修改/ ADDITION

Basis 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) {

    }
}  

其中ParamAParamBParamC只是用于显示其中使用内容的类:

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

当您通过new Operation().execute(new ParamA());执行操作时,将调用第一个onPreExcute来实例化您可能需要的一些变量(如设置连接)。然后将execute中的给定参数放在doInBackground中作为参数。完成后,doInBackground的返回值将作为参数传递到onPostExecute,您可以在其中显示结果。

doInBackground中,您可以将结果发布到UI线程。快捷方式是在publishProgress中使用doInBackground,因为您无法直接从doInBackground调用UI线程(因为AsyncTask是另一个Thread,而不是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] + ")."); } } } 在UI线程上运行。

实际有用的示例

Threads

您还可以通过此代码访问其他doInBackground(或AsyncTaskActivity.this.runOnUiThread(new Runnable() { public void run() { textView.setText("Called the UI from Thread"); } }); )中的UI主题(尽管您应该尽量避免使用它):

{{1}}