2012-03-13 4 views
0

У меня есть совершенно отдельный класс, который расширяет AsyncTask, я использую его для выполнения html get, поэтому он не будет замораживать пользовательский интерфейс. В конструкторе AsyncTask Im передается контекст активности, который вызывает задачу .execute(), поэтому я могу показать ProgressDialog во время работы htmlget. Здесь возникла первая проблема: при повороте телефона текущее представление было разрушено, и когда приложение достигло диалогового окна .dismiss(), оно потерпело крах, поскольку вид, к которому он был присоединен, больше не существует. Мне удалось решить эту проблему примерно в 95% случаев, однако в оставшихся 5% проблема остается. Мой оригинальное решение было заставить отключить вращение, в то время как htmlget работает, путем пропускания активности к AsyncTask, а также и применениеОшибка при отклонении ProgressDialog в AsyncTask

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 

в onPreExecute(), и вызов

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

в onPostExecute(), таким образом, даже если пользователь поворачивает экран, он не уничтожит текущую активность. Но, как я уже упоминал, в оставшихся 5% проблема все еще остается проблемой, что приводит к силе. Все, что я знаю, являются следующие:

У меня есть этот StackTrace, что мои пользователи снабдили меня через Android Market:

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-й линии упоминается в StackTrace):

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, но уровень компилирования выставиться для андроид 2.2.x в затмении, так как у меня есть «перейти на SD-карту» функция включена

судя немногих пользователей отправленных сообщений, они запускают htmlget, они, скорее всего, видят всплывающее окно ProgressDialog, а затем приложение вылетает

Любая идея, что может вызвать это? Или как его решить? Является ли мой подход NOSENSOR правильным?

+0

это сложно. Вы должны воссоздать/скрыть диалог прогресса, когда ваше приложение приостанавливается/возобновляется. – zapl

+0

приложение не останавливается, пока этот htmlget не запускается, он просто не должен, он занимает не более 5 секунд в обычной ситуации, поэтому я не знаю, почему это происходит. – hundeva

+1

Если экран вращается, вы должны получить 'onPause', как только вращение закончено' onResume'. AsyncTask все равно будет работать.Если вы динамически воссоздаете диалог при возобновлении, у вас не должно возникнуть проблемы. – zapl

ответ

0

кажется, что ошибка ушла, по крайней мере, я не получил никаких новых отчетов в новой версии. То, что я сделал, я перекрытое это основной вид деятельности:

public Dialog onCreateDialog(int id) 

тогда, я передал свою деятельность на задачи и выставиться в nosensor штучке в начале, а затем, когда я показал диалог, сделал это:

activity.showDialog(0); 

тогда, когда мне пришлось уволить его, я сделал это:

activity.dismissDialog(0); 

кажется, он работает таким образом. Простите меня, если есть синтаксический террор, я не на моем компьютере разработчика :)

Смежные вопросы