3

這可能是另一個問題的副本,我不確定。我已經閱讀過類似的問題,但要麼無法理解它,要麼無法成功應用給定的解決方案。如何在我的活動更改或銷燬時停止ASyncTask崩潰?

我創建了一個具有多個選項卡的應用程序。當用戶滑入選項卡時,大多數選項卡使用ASyncTask更新數據。但是,當AST仍在運行時(如發生很多情況,例如當用戶旋轉屏幕或使用後退按鈕退出時),有關活動的某些內容會發生變化,應用程序將強制關閉(ANR)。

下面是我在logcat中看到的情況:

10-30 11:30:01.422: E/AndroidRuntime(4687): FATAL EXCEPTION: main 
10-30 11:30:01.422: E/AndroidRuntime(4687): java.lang.NullPointerException 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at com.appconstructor.khcreates.Core$refreshList.onPostExecute(Core.java:913) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at com.appconstructor.khcreates.Core$refreshList.onPostExecute(Core.java:1) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at android.os.Looper.loop(Looper.java:137) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-30 11:30:01.422: E/AndroidRuntime(4687):  at dalvik.system.NativeStart.main(Native Method) 

從我所看到的,的AsyncTask(refreshlist)不能處理的事實,有沒有申請留下來將更改應用於。

我想要做的是讓一個應用程序不強制關閉,如果沒有任何活動。

  1. 任我想要的AsyncTask停止,如果活動停止
  2. 或者我要申請只保留任務運行,但不會強制關閉(如:沒有任何反應onPostExecute()如果沒有連接活動。

如果有人需要我的onPostExecute()代碼來解決這個問題,讓我知道。

這已被竊聽我一會兒,我一直沒能解決這個我自己。我的應用程序的經驗是非常可怕的,這個bug已經到位elp會非常感謝!

在此先感謝!

回答

4

這是更好地與您用於​​命令相同的實例執行cancel(true)

AsyncTask<Void,Void,Void> task = new MyAsyncTask(); 
task.execute(); 

..... 

task.cancel(true); 

編輯:您需要存儲您的AsyncTask實例individualy在每個片段中,這樣可節省的new freshList(this,getActivity(),mNum)實例作爲你片段的變量和,因爲這是一個片段,執行cancel(true)onPause()方法你的片段。希望這會幫助你。

+0

儘管這樣做的確有竅門,但請參閱Nunu針對我的案例(片段)回答的答案。 –

9

請參考你的任務,並在onDestroyonConfigurationChanges方法,取消任務..

if(task != null && task.getStatus() == Status.RUNNING) 
    task.cancel(true); 
+0

我目前正在嘗試,但也許我做錯了。我設置了對'onPreExecute()'的任務的引用,像'AST = this;'和'onConfigurationChanged',我調用'AST.cancel(true);',但是崩潰仍然發生。 –

+1

在你的onPostExecute中,嘗試添加if(isCancelled())return; – Nermeen

+0

感謝您的更新代碼示例。我用我目前正在做的事情創建了一個粘貼(它仍然強制關閉)。也許你可以看到我做錯了什麼? http://pastebin.com/SBYGiexG編輯 - 此外,可能有多個refeshList實例運行(因爲我使用viewpager):錯誤可以在那裏嗎? –

相關問題