[英]Issues on displaying Toast within onPostExecute of AsyncTask class
在這個論壇上有很多關於這個問題的問題,但是沒有一個對我有用。 所以我在這里問這個問題。 我正在嘗試從MySQL數據庫讀取數據。 使用PHP Web服務成功從數據庫中獲取數據后,我想顯示數據。 但是當我為此使用Toast時,Eclipse阻止我編寫Toast命令並向我顯示錯誤
Toast類型的方法makeText(Context,CharSequence,int)不適用於參數(VersionReader,String,int)
Java代碼是:
public class VersionReader extends AsyncTask<URI, Integer, Integer>{
private String TAG = "RESULT";
int version = 0;
int local_version = 0;
public VersionReader(int local_version){
this.local_version = local_version;
}
@Override
protected Integer doInBackground(URI... urls) {
try{
HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(urls[0]);
HttpResponse response = httpclient.execute(request);
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
version = Integer.parseInt(in.readLine());
}catch(Exception e){
e.printStackTrace();
}
return version;
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
Toast.makeText(this, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
}
}
有誰知道如何擺脫這個問題?
只需更換
Toast.makeText(this, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
與
Toast.makeText(getApplicationContext(), "The lastest version is " + result, Toast.LENGTH_SHORT).show();
注意:如果您的VersionReader
類在Activity
由於您的VersionReader
類不是insode Activity
或Service
,請在您的類中創建一個Context
全局變量,然后從Constructor中獲取它。
private Context context;
public VersionReader(Context context) {
this.context = context;
}
並在onPostExecute()
中使用
Toast.makeText(context, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
更改,因為這里this
類似於給VersionReader
的AsyncTask
Toast.makeText(this, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
至
Toast.makeText(YourActivity.this, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
要么
Toast.makeText(getApplicationContext(), "The lastest version is " + result, Toast.LENGTH_SHORT).show();
編輯
public class VersionReader extends AsyncTask<URI, Integer, Integer>{
private Context context;
public VersionReader(Context context) {
this.context = context;
}
// Blah blah
// Then use the context any where
}
onPreExecute(),onPostExecute(Result)在ui線程上調用。 因此,您可以在這里展示烤面包。
Toast.makeText(YourActivity.this, "The lastest version is " + result,Toast.LENGTH_SHORT).show();
為了清楚起見,請檢查鏈接 。
使構造函數如下:
Context ctx;
public VersionReader(int local_version , Context c){
this.local_version = local_version;
this.ctx = c;
}
現在,在您的Toast中使用此ctx變量。
Toast.makeText(ctx, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
更換
Toast.makeText(this, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
由
Toast.makeText(getApplicationContext(), "The lastest version is " + result, Toast.LENGTH_SHORT).show();
這里this
是指VersionReader類不是你的活動 。 所以更換
Toast.makeText(this, "The lastest version is " + result, Toast.LENGTH_SHORT).show();
與
Toast.makeText(getApplicationContext(), "The lastest version is " + result, Toast.LENGTH_SHORT).show();
使用getApplicationContext()
Toast.makeText(getApplicationContext(), "The lastest version is " + result, Toast.LENGTH_SHORT).show();
因為即使您銷毀了Activity,AsyncTask仍在后台運行。 因此,如果您使用ActivityName.this ,那么即使銷毀了活動,它也會找到活動參考。 所以會給出錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.