トーストを表示しようとするときのコンテキストの問題
-
02-10-2019 - |
質問
私はアシナクスクの中にトーストを表示しようとします。この最初のコードは、私たちが呼ぶかもしれないアクティビティに配置されます 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の内側
所属していません StackOverflow