【问题标题】:Android: App crashes eventually in Async Task's on Post ExecuteAndroid:应用程序最终在执行后的异步任务中崩溃
【发布时间】:2013-02-02 10:20:35
【问题描述】:

在我的应用程序中,我正在从网络服务器获取数据。我使用异步任务来获取数据。但是,问题有时是我的应用程序在progressDialog.dismiss() 的 onPostExecute 中崩溃。但是,这种情况并非每次都会发生。这是我的代码:

异步任务

public class GetFeaturedStoreListAsyncTask extends AsyncTask<Void, Void, String>
{
Context ctx;
ProgressDialog pd;
ListView listFeaturedStore;
String dataUrl;
public static final String TAG = "GetFeaturedStoreAsyncTask";
public static ArrayList<StoreDescriptionDAO> featuredDAOList;

public GetFeaturedStoreListAsyncTask(String dataUrl, Context ctx, ListView listFeaturedStore) 
{
    this.dataUrl = dataUrl;
    this.ctx = ctx;
    this.listFeaturedStore = listFeaturedStore;
}//Constructor

@Override
protected void onPreExecute() 
{
    pd = new ProgressDialog(ctx);
    pd.setMessage(ctx.getResources().getString(R.string.please_wait));
    pd.show();
}//onPreExecute

@Override
protected String doInBackground(Void... params) 
{   
    Log.v(TAG, "doInBackground called");
    JSONParser jsonParser = new JSONParser();
    String serverResponse = jsonParser.getJsonString(dataUrl);
    return serverResponse;
}//doInBackground

@Override
protected void onPostExecute(String response) 
{
    FeaturedListAdapter mFeaturedListAdapter = null;
    mFeaturedListAdapter = getFeaturedListAdapter(response);

    if(mFeaturedListAdapter != null)
    {
        Log.v(TAG, "adapter not null");
        listFeaturedStore.setAdapter(mFeaturedListAdapter);
        listFeaturedStore.setLayoutAnimation(AnimationUtility.fastCascadeListViewAnimation());
        pd.dismiss();
    }//if
    else
    {
        Log.v(TAG, "adapter null");
        pd.dismiss();
        SeattleNightLifeUtility.OpenUtilityDialog(ctx, 
                ctx.getResources().getString(R.string.network_error_msg));
    }//else
}//onPostExecute

private FeaturedListAdapter getFeaturedListAdapter(String jString) 
{
    FeaturedListAdapter mFeaturedAdapter = null;
    featuredDAOList = 
            ParsedFeaturedStoreDescData.getFeaturedStoreDesc(jString);
    if(featuredDAOList != null 
            && featuredDAOList.size() > 0)
    {
        mFeaturedAdapter = new FeaturedListAdapter(ctx, featuredDAOList);
        Log.v(TAG, "arraylist size > 0");
        return mFeaturedAdapter;
    }//if
    else
    {
        return null;
    }//else
}//getFeaturedListAdapter
}//GetCityStoreAsyncTask

这是我的日志:

Activity com.dzo.seattlesnightlife.FeaturedActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4a715c38 that was originally added here
02-02 15:23:45.426: E/WindowManager(12627): android.view.WindowLeaked: Activity com.dzo.seattlesnightlife.FeaturedActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4a715c38 that was originally added here
02-02 15:23:45.426: E/WindowManager(12627):     at android.view.ViewRoot.<init>(ViewRoot.java:247)
02-02 15:23:45.426: E/WindowManager(12627):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
02-02 15:23:45.426: E/WindowManager(12627):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-02 15:23:45.426: E/WindowManager(12627):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
02-02 15:23:45.426: E/WindowManager(12627):     at android.app.Dialog.show(Dialog.java:241)
02-02 15:23:45.426: E/WindowManager(12627):     at com.dzo.seattlesnightlife.asynctask.GetFeaturedStoreListAsyncTask.onPreExecute(GetFeaturedStoreListAsyncTask.java:40)
02-02 15:23:45.426: E/WindowManager(12627):     at android.os.AsyncTask.execute(AsyncTask.java:391)
02-02 15:23:45.426: E/WindowManager(12627):     at com.dzo.seattlesnightlife.FeaturedActivity$MyTimerTask$1.run(FeaturedActivity.java:173)
02-02 15:23:45.426: E/WindowManager(12627):     at android.os.Handler.handleCallback(Handler.java:587)
02-02 15:23:45.426: E/WindowManager(12627):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-02 15:23:45.426: E/WindowManager(12627):     at android.os.Looper.loop(Looper.java:123)
02-02 15:23:45.426: E/WindowManager(12627):     at android.app.ActivityThread.main(ActivityThread.java:4633)
02-02 15:23:45.426: E/WindowManager(12627):     at java.lang.reflect.Method.invokeNative(Native Method)
02-02 15:23:45.426: E/WindowManager(12627):     at java.lang.reflect.Method.invoke(Method.java:521)
02-02 15:23:45.426: E/WindowManager(12627):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
02-02 15:23:45.426: E/WindowManager(12627):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-02 15:23:45.426: E/WindowManager(12627):     at dalvik.system.NativeStart.main(Native Method)
02-02 15:23:45.456: V/GetFeaturedStoreAsyncTask(12627): arraylist size > 0
02-02 15:23:45.456: V/GetFeaturedStoreAsyncTask(12627): adapter not null
02-02 15:23:45.526: W/dalvikvm(12627): threadid=1: thread exiting with uncaught exception (group=0x400207d8)
02-02 15:23:45.536: E/AndroidRuntime(12627): FATAL EXCEPTION: main
02-02 15:23:45.536: E/AndroidRuntime(12627): java.lang.IllegalArgumentException: View not attached to window manager
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:200)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.view.Window$LocalWindowManager.removeView(Window.java:432)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.app.Dialog.dismissDialog(Dialog.java:278)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at  android.app.Dialog.access$000(Dialog.java:71)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.app.Dialog$1.run(Dialog.java:111)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.app.Dialog.dismiss(Dialog.java:268)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at com.dzo.seattlesnightlife.asynctask.GetFeaturedStoreListAsyncTask.onPostExecute(GetFeaturedStoreListAsyncTask.java:63)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at com.dzo.seattlesnightlife.asynctask.GetFeaturedStoreListAsyncTask.onPostExecute(GetFeaturedStoreListAsyncTask.java:1)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.os.AsyncTask.finish(AsyncTask.java:417)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.os.AsyncTask.access$300(AsyncTask.java:127)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.os.Looper.loop(Looper.java:123)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at android.app.ActivityThread.main(ActivityThread.java:4633)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at java.lang.reflect.Method.invokeNative(Native Method)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at java.lang.reflect.Method.invoke(Method.java:521)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-02 15:23:45.536: E/AndroidRuntime(12627):    at dalvik.system.NativeStart.main(Native Method)
02-02 15:23:45.556: W/ActivityManager(180):   Force finishing activity com.dzo.seattlesnightlife/.FeaturedActivity

【问题讨论】:

  • @RaghavSood 它的 pd.dismiss() 行号。 63
  • 我将屏幕方向固定为仅纵向,因此不受旋转设备屏幕的影响。
  • Ohhk .. 实际上它正在发生,因为您调用 AsyncTask 的活动要么在后台,要么在 AsyncTask 执行时重新创建..
  • @user370305 那么有什么方法可以检查这种情况吗?
  • (我不确定它是否对你有帮助)对于活动有一个方法onCongigurationChanged()。这会阻止 Activity 重新创建。但为此,您必须在AndroidManifest.xml 文件的活动标签中添加configChanged 属性。

标签: android android-asynctask progressdialog


【解决方案1】:

在您退出 Activity 后尝试显示 ProgressDialog 时会出现此问题。

我刚刚解决了这个问题试试这个方法:

if ((this.mDialog != null) && this.mDialog.isShowing()) {
    this.mDialog.dismiss();
    this.mDialog = null;
 }

在您覆盖的 onDestroy()onStop() 方法中。

编辑:您可以创建接口,将其传递给 AsyncTask(在构造函数中),然后在 onPostExecute 中调用方法。

例如

你的界面:

public interface OnTaskCompleted {
    void onTaskCompleted();
}

您的活动:

public YourActivity implements OnTaskCompleted {
    //your Activity
}

还有你的 AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object> { //change Object to required type
    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener) {
        this.listener=listener;
    }

//required methods

    protected void onPostExecute(Object o) {
        //your stuff
        listener.onTaskCompleted();
    }
}

【讨论】:

  • 我认为应该是dismiss()而不是cancel()。并添加对 null 的检查。 if (pDialog != null && pDialog.isShowing())
  • 我认为如果我们在单独的类中有 AsyncTask,那么问题仍然存在
  • 应该是 dialog.dismiss()
  • 如果Asynctask在不同的类,那么你应该在Activity中使用callBack方法和进度条显示。
  • 我的异步任务属于不同的类。你说的是哪种回调方法?
【解决方案2】:

当试图在这里显示ProgerssDialog 时出现此问题,我在您的代码中遇到了问题,您必须在ProgressDialog 创建中指定您当前的活动上下文。

onPostExecute

if (null != pd && pd.isShowing()) {
    pd.dismiss();
}

【讨论】:

    【解决方案3】:

    似乎问题出在您的适配器类中。如果您查看日志条目。看起来在打印适配器不为空之后出现异常。所以请确保您的适配器工作正常。我要说的另一件事是。为什么你使用相同的代码两次。

    pd.dismiss();
    

    如果在这两种情况下你都将它解散。最好通过在它当前所在的 if else 语句上方写下它来使其全局化。

    【讨论】:

    • 谢谢,但应用程序在第 1 行崩溃。 63 即 pd.dismiss()。如果适配器有任何问题,那么它应该在具有适配器代码的行之一上崩溃。
    • 好的,根据您遇到的错误,我可以告诉您,您正在尝试解除与 Window 分离的窗口对象。为什么您会泄漏窗口是因为您的活动有打开窗口并且您正在关闭其父 Activity,因此该窗口没有机会自行关闭。尝试在 Activity 关闭之前关闭您的对话框。
    • 但是我没有关闭我的活动。异步任务在活动开始时开始运行,并且在 onPostExecute() 中 UI 得到更新。如果我误解了你的意思,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2018-09-17
    • 2015-10-11
    相关资源
    最近更新 更多