3

AsyncTask 内に Toast を表示しようとしています。この最初のコード片はMyActivity、 と呼ばれるアクティビティに配置され、正常に動作します。

Toast.makeText(this, "Toast!", Toast.LENGTH_SHORT).show();

次に、 and の新しいインスタンスを作成し、MyObjectを呼び出しますmethod()。このコードは にも配置されMyActivityます。

MyObject obj = new MyObject(this);
obj.method();

これが の定義ですMyObject。ProgressDialog は正常に動作しますが、トーストは表示されません。

public class MyObject {
   Context cxt;

   public MyObject(Context cxt) {
      this.cxt = cxt;
   }

   public void method() {
      new MyAsyncTask().execute();
   }

   private class MyAsyncTask extends AsyncTask<Object, Integer, Boolean> {
      protected void onPreExecute() {
         Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // works fine
    }

        protected Boolean doInBackground(Object... params) {
           Looper.prepare();
           Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // doesn't work
        }
   }
}

最初の例と以下でまったく同じことをしていると思いましたが、どうやら何かが欠けているようです。の代わりにgetApplicationContext()andも試しましたが、同じ結果になりました。cxt.getApplicationContext()cxt

4

2 に答える 2

2

runOnUIThreadそれをメソッドにラップします。

runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show();
    }
});

これは、doInBackgroundメソッドが UI スレッドで実行されないためです。そのため、強制する必要があります。

于 2010-09-13T19:36:36.147 に答える
0

使用する必要があります

MyObject.this 

AsyncTask の内部

于 2010-09-13T20:28:25.160 に答える