我有一个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();
}
});
}
....
};
答案 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中进行线程化的最佳两个选项。