2012-03-13 69 views
0

我有一個完全獨立的類,它擴展了AsyncTask,我用它來執行html get,所以它不會凍結UI。在AsyncTask Im的構造函數中傳遞活動的上下文,該上下文調用任務的.execute(),以便在htmlget運行時顯示ProgressDialog。第一個問題是:旋轉手機時,當前視圖被破壞,當應用程序到達對話框的.dismiss()時,它會崩潰,因爲它所連接的視圖不再存在。在95%的案例中,我確實設法解決了這個問題,但在剩下的5%中,仍然存在問題。我原來的解決方案是強制禁用的循環,而htmlget運行時,通過傳遞活動到的AsyncTask的歡迎,並在onPreExecute()調用在解除AsyncTask中的ProgressDialog時出錯

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 

,並調用

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

在onPostExecute()方法中,即使用戶旋轉屏幕,也不會破壞當前活動。但是,正如我已經提到的那樣,在剩下的5%中,仍然存在一個問題,導致關閉。我所知道的有以下幾種:

我有這個堆棧跟蹤,其中我的用戶給我提供了通過Android電子市場:

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 com.vasga.telvira.AsyncHttpGetter.onPostExecute(AsyncHttpGetter.java:160) 
at com.vasga.telvira.AsyncHttpGetter.onPostExecute(AsyncHttpGetter.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(Native Method) 
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(Native Method) 

它發生在的AsyncTask,以下行(這是中提到的第160行堆棧跟蹤):

if(pd.isShowing()) pd.dismiss(); //dismiss the pd after we are done, if it is visible(it should be) 

的pd.isShowing()不能引起這一點,因爲我補充說,如果第一個可能的解決方案,也許在對話框中沒有顯示在某些罕見的情況,但沒有奏效

我的應用程序與android 1.6.x兼容,但在eclipse中有一個爲android 2.2.x設置的編譯級別,因爲我已經啓用了「移動到SD卡」功能

從少數用戶發送的消息判斷,他們啓動了htmlget,他們很可能會看到ProgressDialog彈出,然後應用程序崩潰

任何想法是什麼會導致這種情況?或者如何解決它?我的NOSENSOR方法是否正確?

+0

這很棘手。只要您的應用程序暫停/恢復,您應該重新創建/隱藏進度對話框。 – zapl 2012-03-13 19:49:22

+0

當這個htmlget正在運行時,應用程序不會暫停,它只是不應該,通常情況下最多需要5秒,所以我真的不知道爲什麼會發生這種情況。 – hundeva 2012-03-13 19:51:15

+1

如果屏幕旋轉,你應該得到'onPause',一旦旋轉完成'onResume'。 AsyncTask仍然會運行。如果您在恢復時動態地重新創建對話框,則應該沒有問題。 – zapl 2012-03-13 19:53:32

回答

0

看來這個錯誤已經消失了,至少我在新版本中沒有收到任何新的報告。我所做的就是,我的主要活動overrided這樣的:

public Dialog onCreateDialog(int id) 

然後,我通過活動,任務,設置好的了nosensor的thingie開頭,然後當我表現出的對話框中,這樣做:

activity.showDialog(0); 

然後,當我不得不關閉它,我這樣做:

activity.dismissDialog(0); 

看來是這樣工作的。對不起,如果有任何語法錯誤,我不在我的開發人員計算機上:)