我正在尝试使用 Asynctask ,但每当我获得其状态时,它总会返回运行。
我的代码有什么问题?
这就是我加载asynctask的方式:
LongOperation LongOperation = new LongOperation(finalLink[0], download_data);
LongOperation.execute();
Toast.makeText(getApplicationContext(), LongOperation.getStatus().toString(), Toast.LENGTH_SHORT).show();
这是我的asynctask:
private class LongOperation extends AsyncTask<Void, Void, Void> {
public Download_data download_data;
public String link;
public boolean loading;
public LongOperation(String link, Download_data download_data){
this.link = link;
this.download_data = download_data;
}
@Override
protected Void doInBackground(Void... params) {
download_data.download_data_from_link(link);
return null;
}
protected void onPostExecute() {
finish();
}
@Override
protected void onPreExecute() {
Toast.makeText(getApplicationContext(),"Executed.", Toast.LENGTH_LONG).show();
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
答案 0 :(得分:1)
因为您在执行后立即检查状态:
LongOperation.execute();
Toast.makeText(getApplicationContext(), LongOperation.getStatus().toString(), Toast.LENGTH_SHORT).show();
AsyncTask
在后台线程上运行。因此,在调用execute()
控件后移动显示Toast
。到那时,task
仍然在运行。
您将在onPreExecute
的{{1}}收到完成状态。
AsyncTask
如果您对@Override
protected void onPostExecute(Void mVoid) {
Toast.makeText(getApplicationContext(), this.getStatus().toString(), Toast.LENGTH_SHORT).show();
finish();
}
感到困惑,请阅读:Java Multithreading
答案 1 :(得分:0)
onPostExecute()的正确签名确实是;
protected void onPostExecute (Result result)
由于你没有覆盖AsyncTask中的那个,而是定义了另一个重载,所以它(从而finish()
永远不会被调用)。
修复签名,它应该按预期完成。