質問

私はアシナクスクの中にトーストを表示しようとします。この最初のコードは、私たちが呼ぶかもしれないアクティビティに配置されます MyActivity, 、そして正常に動作します:

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

次に、新しいインスタンスを作成します 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()cxt.getApplicationContext() それ以外の cxt, 、しかし同じ結果があります。

役に立ちましたか?

解決

それを包みます runOnUIThread 方法:

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

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

他のヒント

使用する必要があります

MyObject.this 

asynctaskの内側

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top