android-asynctask - ProgressDialog 发生致命异常 : java. lang.IllegalArgumentException

标签 android-asynctask progressdialog illegalargumentexception

我有 10 个使用 AsyncTasks 的应用程序。如您所知,我在异步任务中显示进度对话框以显示任务的进度。但是有一个关于progressdialog的问题我到目前为止还无法解决。

这是我的 AsyncTask 类之一(不在其他类中);

public class GetBalanceAsyncTask extends AsyncTask<Void, Void, String> {

Context context;
ProgressDialog pd;

public GetBakiyeAsyncTask(Context context) {
    this.context = context;
}

@Override
protected String doInBackground(Void... arg0) {
    String userAgent = HttpHelper.getRandomUserAgent(context);
    return HttpHelper.post(PreferenceHelper.getBalanceQueryAPI(context), userAgent);

}

@Override
protected void onPreExecute() {
   super.onPreExecute();
   pd = ProgressDialog.show(context, "","Please wait...",true);
}

@Override
protected void onPostExecute(String result) {
    try {
        if (pd != null & pd.isShowing()) {
            pd.dismiss();
            pd = null;
        }
    } catch (IllegalArgumentException e) {
        pd = null;
        e.printStackTrace();
    }
    if (result != null & result.length() > 0) {
        Utils.doTask(result);
    } else {
        Utils.ShowToast(context,
                "An error has occurred, please try again.",
                STYLE_CONFIRM, LENGTH_LONG);
    }

    super.onPostExecute(result);
}

}

执行是

java.lang.IllegalArgumentException: View not attached to window manager
   at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:381)
   at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:226)
   at android.view.Window$LocalWindowManager.removeView(Window.java:432)
   at android.app.Dialog.dismissDialog(Dialog.java:278)
   at android.app.Dialog.access$000(Dialog.java:71)
   at android.app.Dialog$1.run(Dialog.java:111)
   at android.app.Dialog.dismiss(Dialog.java:268)
   at fragments.RuyalarFragment$getRuyalarAsyncTask.onPostExecute(GetBalanceAsyncTask.java:27)
   at fragments.RuyalarFragment$getRuyalarAsyncTask.onPostExecute(GetBalanceAsyncTask.java:1)
   at android.os.AsyncTask.finish(AsyncTask.java:417)
   at android.os.AsyncTask.access$300(AsyncTask.java:127)
   at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:130)
   at android.app.ActivityThread.main(ActivityThread.java:3691)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:507)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
   at dalvik.system.NativeStart.main(NativeStart.java)

我几乎到处都搜索了解决方案,但没有任何有效结果。大多数答案都包含使用 isFinishing、onDestroy 或类似的内容,但没有人确定哪个有效。

感谢您的建议。

最佳答案

如何重现错误:

在您的设备上启用此选项:设置 -> 开发者选项 -> 不保留事件。 在执行“AsyncTask”并且显示 ProgressDialog 时按“Home”按钮。 一旦 Activity 被隐藏,Android 操作系统就会将其销毁。当调用 onPostExecute 时,Activity 将处于“完成”状态,并且 ProgressDialog 将不会附加到 Activity。

如何修复它:

检查 onPostExecute 方法中的事件状态。 在 onDestroy 方法中关闭 ProgressDialog。否则,将抛出 android.view.WindowLeaked 异常。此异常通常来自事件完成时仍处于事件状态的对话框。

试试这个代码:

public class YourActivity extends Activity {

<...>

private void showProgressDialog() {
    if (pDialog == null) {
        pDialog = new ProgressDialog(StartActivity.this);
        pDialog.setMessage("Loading. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
    }
    pDialog.show();
}

private void dismissProgressDialog() {
    if (pDialog != null && pDialog.isShowing()) {
        pDialog.dismiss();
    }
}

@Override
protected void onDestroy() {
    dismissProgressDialog();
    super.onDestroy();
}

class LoadAllProducts extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        showProgressDialog();
    }

    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args)
    {
        doMoreStuff("internet");
        return null;
    }


    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url)
    {
        if (YourActivity.this.isDestroyed()) {
            return;
        }
        dismissProgressDialog();
        something(note);
    }
}

}

关于android-asynctask - ProgressDialog 发生致命异常 : java. lang.IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25093281/

相关文章:

java - fragment 、AsyncTask 和监听器

java - ProgressDialog 背景 Activity 淡出动画

android - ProgressDialog 嵌套在另一个空白对话框中

eclipse - java.lang.IllegalArgumentException : The main resource set specified [. ..\org.eclipse.wst.server.core\tmp0\wtpwebapps\appname] 无效

java - Collections.sort 抛出 IllegalArgumentException

android - 在执行 onPostExecute(Void result) android 之后调用 onListItemClick()

Android Looper.prepare() 和 AsyncTask

android - 进度对话框在 Lollipop Devices 上有白色背景,

java - Android - 如何从 Sdcard 获取文件字节

java - 如何正确创建 AsyncTask