当应用程序最小化时,AsyncTask.onPostExecute()显示AlertDialog会导致无响应的UI

时间:2013-03-22 17:41:41

标签: android user-interface android-asynctask

在AsyncTask中显示AlertDialog的奇怪效果:如果在执行AsyncTask期间应用程序被最小化

private class CheckDeviceConfiguration extends AsyncTask<Void, Void, Boolean> {
private ProgressDialog progressDialog;

@Override
protected void onPreExecute() {
    super.onPreExecute();    
    progressDialog = ProgressDialog.show(ActivitySIPCountrySelection.this, "Title", "working...", true);                        
}

@Override
protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);

    progressDialog.dismiss(); //hide progress dialog previously shown

    if (!result) {
        AlertDialog.Builder dialog = new AlertDialog.Builder(ActivitySIPCountrySelection.this);
        dialog.setCancelable(false);
        dialog.setMessage("Message");
        dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int arg1) {
            //do something
            }
        });

        dialog.show();
     }

  }
@Override
protected Boolean doInBackground(Void... params)
    Thread.sleep(5000);
    return false;
}

}

如果我点击我的应用图标进行恢复,则用户界面没有响应,活动看起来有点变暗(无效?)。后退按钮无效。

修改

有人问我在哪里调用AsyncTask。好吧,来自Activity onCreate()。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_sip_country_selection);

        new CheckDeviceConfiguration().execute();
    }

异步任务正确显示进度对话框并将其隐藏在onPostExecute中。

1 个答案:

答案 0 :(得分:1)

注意:AsyncTask管理使用ThreadPoolExecutor创建的线程池。它将有5到128个线程。如果有超过5个线程,那么这些额外的线程将被移除最多10秒钟。 (注意:这些数字适用于目前可见的开源代码,因Android版本而异。)

请单独留下AsyncTask线程。

按Home可将您从应用程序切换到主屏幕,同时让您的应用程序在后台运行。

当您的手机内存等资源不足时,它会开始关闭在后台运行的应用,这样您的手机就有足够的资源来应对您现在要做的事情。游戏通常是手机将要杀死的第一批应用程序。节省资源,因为他们经常使用比其他应用程序更多的内存和CPU。这就是为什么有时你的游戏仍在暂停运行的原因,有时Android会为你关闭它。

http://developer.android.com/guide/components/tasks-and-back-stack.html。有关详细信息,请检查任务和后退任务。

您可以通过调用cancel(true)取消asynctask,中断将被发送到后台线程,这可能有助于可中断的任务。否则,您应该确保在doInBackground()方法中定期检查isCancelled()。

 @Override
 protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
d.cancel(true);
if(d.isCancelled())
{
    System.out.println("Destroyed....");
}
 }
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
d.cancel(true);
if(d.isCancelled())
{
    System.out.println("Destroyed....");
}
}

当您的活动恢复时,创建一个新的asynctask实例并再次执行。

http://code.google.com/p/shelves/。检查Romain Guy的货架项目。

http://developer.android.com/reference/android/content/AsyncTaskLoader.html。还要检查asynctask loader。

asynctask的替代品是RoboSpice。 https://github.com/octo-online/robospice

常见问题&#39; https://github.com/octo-online/robospice/wiki/Advanced-RoboSpice-Usages-and-FAQ