Android:活动被破坏,处理程序丢失。如何保存 - 例如在onSaveInstanceState())?

时间:2013-09-17 23:25:37

标签: android multithreading android-activity orientation handler

我有一个Activity(主要活动),它显示在另一个线程上运行的操作的进度。它有一个由线程调用的处理程序成员,此处理程序更新进度条等。

如果在此过程中更改了方向,则会销毁活动并以其他方向重新创建活动。处理这个的任何建议?它必须是一个常见的问题,但我认为我不理解范式。我对Android开发很新,这似乎是一个基本问题。希望有人可以提供帮助。

实施例。 SomeClass获取对处理程序的引用(方法SomeClass.setHandler()),并向其发送带有状态信息的消息。

public class MainActivity extends Activity {

private Handler handler;

private createHandler() 
{
   handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
          // updates views in MainActivity, e.g. ProgressBar and TextView
        }
   }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    createHandler();
}

protected void doThingsInSepThread() {
    Thread t = new Thread(new Runnable () {
       @Override
       public void run() {
          SomeClass sc = new SomeClass();
          sc.setHandler(handler);
          sc.method();
       }
    });
}

....

};

1 个答案:

答案 0 :(得分:4)

这是一个非常常见的问题,因为如果更改方向,活动将被销毁并重新创建。因此,您的处理程序会在您识别时丢失。您无法在onSaveInstanceState()中保存处理程序,因为它只接受具有Parcelable / Serializable接口且Handler不具备这些接口的对象。

一种可能性是(is)在这种情况下不赞成保存Object实例的方法

@Override
public Object onRetainNonConfigurationInstance() {
    if(handler != null)
        return handler;
    else 
        return null;
}

在onCreate中,您可以使用

获取该已保存的实例
Handler savedHandler = (Handler) getLastNonConfigurationInstance();
if(savedHandler != null)
    handler = savedHandler;

但是因为它已被弃用,你应该使用另一个选项来解决这个问题。

如果你想坚持你的线程,你应该考虑Non-UI Fragment and set retainInstanceState(true)。有了这个,Fragment在Activity的重新创建中幸存下来,你的线程就会保存。这是一个很好的tutorial,但它使用AsyncTask。只需用你的线程替换它就可以了。

另一种可能性是IntentService。看一下这个tutoria l。

这是IMO在Android中进行线程化的最佳两个选项。