我正在为网络连接启动 AsyncTask ,之后我决定10秒超时,之后任务应取消 网络问题:
final aTask record = new aTask();
record.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( record.getStatus() == AsyncTask.Status.RUNNING ) {
record.cancel(true);
Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
}
}
}, 10000 );
我注意到在取消异步任务后, Spinner 对话框始终在运行。 我怎样才能解雇?
答案 0 :(得分:2)
更容易的是在Handler代码中添加dialog.dismiss():
final aTask record = new aTask();
record.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( record.getStatus() == AsyncTask.Status.RUNNING ) {
record.cancel(true);
dialog.dismiss(); <----------------- ADDED HERE
Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
}
}
}, 10000 );
非常感谢大家的帮助
答案 1 :(得分:1)
取消Asynctask时,她不会离开doInBackground ......
块引用 可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)而不是onPostExecute(Object)。为确保尽快取消任务,应始终定期从doInBackground(Object [])检查isCancelled()的返回值(如果可能)(例如在循环内)。
偶尔检查isCancelled():
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}
答案 2 :(得分:1)
全局声明Dialog
Dialog dlg;
onPreExecute
AsynTask
dlg = new Dialog(MainActivity.this);
dlg.show();
在doInBackground
if(this.isCancelled())
dlg.dismiss();
在onPostExecute
的{{1}}中执行此操作
AyncTask
或者,如果您只是想在 handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( this.getStatus() == AsyncTask.Status.RUNNING ) {
if(dlg.isShowing())
dlg.dismiss();
Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
}
}
}, 10000 );
完成工作后关闭对话框,那么在AsynTask
内只需使用onPostExecute
<强>信息强>
的文档如果此任务在正常完成之前被取消,则返回true。如果在任务上调用cancel(boolean),则应该从doInBackground(Object [])定期检查此方法返回的值,以便尽快结束任务。
答案 3 :(得分:0)
为您提供一个全局参考对话框。
Dialog d;
//现在在你的AsyncTask中
Class MyTask extends AsyncTask{
onPostExecute(){
if(d!=null){
d.dismiss(); // do this to dismiss once task finished
}
}
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
// keep doing this
if(this.isCancelled()){
d.dismiss();
}