0

在 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;
}

}

如果我单击我的应用程序图标进行恢复,UI 没有响应并且活动看起来有点(不活动?)。后退按钮无效。

编辑:

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

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

        setContentView(R.layout.activity_sip_country_selection);

        new CheckDeviceConfiguration().execute();
    }

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

4

1 回答 1

1

注意:AsyncTask 管理一个使用 ThreadPoolExecutor 创建的线程池。它将有 5 到 128 个线程。如果线程数超过 5 个,这些多余的线程最多会停留 10 秒,然后才会被移除。(注意:这些数字是针对目前可见的开源代码,并因 Android 版本而异)。

请不要管 AsyncTask 线程。

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

当您的手机内存等资源不足时,它将开始关闭在后台运行的应用程序,以便您的手机有足够的资源来执行您现在尝试执行的操作。游戏通常是手机为了节省资源而“杀死”的第一批应用程序之一,因为它们通常比其他应用程序使用更多的内存和 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/。罗曼盖伊的检查货架项目。

http://developer.android.com/reference/android/content/AsyncTaskLoader.html。还要检查异步任务加载器。

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

常见问题解答https://github.com/octo-online/robospice/wiki/Advanced-RoboSpice-Usages-and-FAQ

于 2013-03-23T07:13:04.183 回答