我正在开发一个必须能够在AsyncTask
运行期间轮换的应用。
我试图实现this帖子中找到的this模式。我还实现了onPause()
和onResume()
,我可以使用json和gson(重新)将数据存储在共享首选项中。这部分似乎运作良好。
当AsyncTask
调用onPostExecute()
而不旋转屏幕时,一切正常。但是,当屏幕在 <{1}}期间旋转时,AsyncTask
我的应用显示出奇怪的行为。仔细观察,我注意到在调试时(在Android Studio中)onPostExecute()
中MainActivity
的{ID}与onPostExecute()
创建的MainActivity
的ID不同。因此,在onCreate()
期间,使用旧 onPostExecute()
处理数据,同时已创建另一个MainActivity
!在AsyncTask完成之前,视图不会完全更新。这可能也是一个不好的迹象......
很难从我的代码中提取一个小项目,但正如我所说,我使用了this博客中的代码。唯一真正的区别是,为了防止内存泄漏,而不是内部MainActivity
我设法创建一个(内部)私有静态类:
private class DummyTask
我是从here获得的。
这就是我的onCreate()的样子:
private static class MoveMrXAsyncTask extends AsyncTask<Void, Void, Move> {
private WeakReference<TaskCallbacks> activityReference;
...
}
我做错了什么?我忘记了@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
mTaskFragment = (TaskFragment) fm.findFragmentByTag(TAG_TASK_FRAGMENT);
// If the Fragment is non-null, then it is currently being
// retained across a configuration change.
if (mTaskFragment == null) {
mTaskFragment = new TaskFragment();
fm.beginTransaction().add(mTaskFragment, TAG_TASK_FRAGMENT).commit();
}
viewModel = new MainActivityViewModel(getApplicationContext(), mTaskFragment);
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
activityMainBinding.setViewmodel(viewModel);
}
的某些内容吗?我正在使用android.app.Fragment。这是正确的片段类吗?
或者数据绑定可能是问题吗?我是否必须解除旧活动中的所有数据绑定并重新绑定到新活动?