4

In my app, I am fetching data from web server. I have used async task for fetching data. But, problem is sometimes my app crashes in onPostExecute on progressDialog.dismiss(). But, this does not happens everytime. Here is my code:

Async Task

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

Here is my logcat:

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
Nitish
  • 3,097
  • 13
  • 45
  • 80
  • @RaghavSood its, pd.dismiss() line no. 63 – Nitish Feb 02 '13 at 10:51
  • I had fixed screen orientation to portrait only, so it was not affected by rotating device screen. – Nitish Feb 02 '13 at 11:03
  • Ohhk .. Actually its happening because your activity which is calling AsyncTask is either in background or recreated at the time of AsyncTask executing.. – user370305 Feb 02 '13 at 11:06
  • @user370305 so is there any way to check this condition? – Nitish Feb 02 '13 at 11:08
  • (I don't sure whether its help you or not)For Activity there is a method `onCongigurationChanged()`. Which preventing Activity from recreated. But for this you have to add `configChanged` attribute in Activity tag of `AndroidManifest.xml` file. – user370305 Feb 02 '13 at 11:12
  • Also you can check by a `boolean flag` whether application is in foreground or in background. (just set flag in `onPause()` and `on Resume()` of Activity). – user370305 Feb 02 '13 at 11:15
  • Look at http://stackoverflow.com/questions/13719792/application-crashes-on-orientation-change-while-showing-progress-bar-in-asynctas and http://stackoverflow.com/questions/2850573/activity-has-leaked-window-that-was-originally-added – user370305 Feb 02 '13 at 11:23

3 Answers3

2

This problem arises when trying to show a ProgressDialog after you've exited an Activity.

I just solved this problem Try this way:

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

in your overridden onDestroy() or onStop() methods.

EDIT : You can create interface, pass it to AsyncTask (in constructor), and then call method in onPostExecute.

For example:

Your interface:

public interface OnTaskCompleted {
    void onTaskCompleted();
}

Your Activity:

public YourActivity implements OnTaskCompleted {
    //your Activity
}

And your 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();
    }
}
Jared Burrows
  • 54,294
  • 25
  • 151
  • 185
Dixit Patel
  • 3,190
  • 1
  • 24
  • 36
0

this problem arises when trying to show ProgerssDialog here what i got the problem in your code you have to specify your current activity context in the ProgressDialog creation.

onPostExecute

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

it seems like problem is in your adapter class .If you look at your log entries .It looks like exception came after printing adapter not null.So make sure that your adapter is working properly.Another thing i want to tell is.Why you are using same code twice.

pd.dismiss();

if in both case you are dismissing it.better make it global by writing above the if else statement in which it currently resides.

kaushal trivedi
  • 3,405
  • 3
  • 29
  • 47
  • Thanks, but the app crashes on line no. 63 which is pd.dismiss(). If adapter had any problem, then it should have crashed on one of lines having adapter code. – Nitish Feb 02 '13 at 11:00
  • ok based on what error you are getting i could tell you that you are trying to dismiss the object of window that is somehow get detached with Window.Why you are getting leaked window is because you activity has an open window and you are closing its parent Activity so that window doesn't get chance to close itself.Try dismissing your dialog before activity gets close. – kaushal trivedi Feb 02 '13 at 11:54
  • But I am not closing my activity. Async task starts running when activity starts, and in onPostExecute() the UI gets updated. Please, tell me if I misunderstood what you are saying. – Nitish Feb 02 '13 at 12:52