当屏幕方向改变时,android线程崩溃

时间:2011-03-09 03:19:44

标签: java android multithreading

我正在创建一个Android应用程序,需要从网址下载文本并在alertdialog上显示。

我创建了一个新线程。线程在Web上读取文件,在线程启动之前出现progressdialog,线程将文件内容从包上的Web打包,并将其传递给处理程序,处理程序停止进度,并显示包中的文本警报性的。这很好用,但是当显示progressdialog并且线程正在运行时屏幕方向发生变化时,应用程序崩溃了。关于如何解决这个问题的任何想法?

任何帮助将不胜感激。 :)

4 个答案:

答案 0 :(得分:2)

当方向发生变化时,操作系统通常会完全关闭您的活动并重新启动它。这会弄乱你的下载线程。可能有效的一种解决方案是将Thread对象保存为非配置数据。您需要在活动中覆盖onRetainNonConfigurationInstance()但是:如果您的Thread对象具有对任何视图或活动相关对象的任何引用,则不执行此操作。这将导致巨大的内存泄漏,并会让您的用户非常快乐。

有关使用onRetainNonConfigurationInstance()的详细信息以及其他方法,请参阅指南主题Handling Runtime Changes。请参阅文章Avoiding Memory Leaks ......好吧,就是这样。

答案 1 :(得分:2)

将活动添加到清单文件中,如下所示 -

<activity 
    android:name=".MyActivity" //Replace  MyActivity with Your activity
    android:configChanges="orientation|screenSize|screenLayout">
</activity>

答案 2 :(得分:0)

这通常是因为您的Activity实际上被销毁并在方向更改时重新创建。

您的选择是:

  1. 接受破坏,并使用AsyncTask代替Thread来获取您的数据。您cancel()方法中的onDestroy()任务。

  2. 还可以在AsyncTask方法中使用cancel()onDestroy()。此外,请处理configuration changes,例如this question的答案。

答案 3 :(得分:0)

KSubedi ......假设可能很危险。逐步测试以消除异常可能会发现它是导致异常的正在运行的进度对话框。治愈方法是:

protected void onPause() {
        super.onPause();
        //if (asynch != null) {asynch.cancel(true);}
        if (progress != null){progress.cancel();}
    }

JAL