【发布时间】:2014-10-15 01:06:36
【问题描述】:
目前我使用一个简单的 Fragment 附加 AsyncTask 和 setRetainInstance(true) 来处理运行时配置更改和直接从 AsyncTask 到 MainActivity 的回调接口。 (following this example)。到目前为止,这工作正常。
但我的问题是数据onProgressUpdate 传递,一旦片段被分离(例如切换到主屏幕时)就会丢失。我的解决方案是在 Fragment 中创建缓冲区变量,用于存储 AsyncTask 中丢失的数据,直到再次附加该 Fragment。
static interface TaskCallbacks {
void onPreExecute();
void onProgressUpdate(MyUpdateBundle p);
void onCancelled();
void onPostExecute();
}
private TaskCallbacks mCallbacks;
private WebFetcherTask mTask;
public List<MyUpdateBundle> updateBuffer;
public MyFragment() {
this.updateBuffer = new ArrayList<MyUpdateBundle>();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (TaskCallbacks) activity;
if(updateBuffer.size() > 0)
{
for(MyUpdateBundle update : updateBuffer)
mCallbacks.onProgressUpdate(update);
updateBuffer.clear();
}
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
...
private class MyAsyncTask extends AsyncTask<Void, MyUpdateBundle, Void> {
...
@Override
protected void onProgressUpdate(MyUpdateBundle... uB) {
if (mCallbacks != null) {
for(MyUpdateBundle u : uB)
mCallbacks.onProgressUpdate(u);
}
else
{
for(MyUpdateBundle u : uB)
updateBuffer.add(p);
}
}
...
在我看来,这似乎是最干净的解决方案,除了保存数据(sinch 这很慢)或使用 StickyBroadcasts(对我来说似乎不是一个干净的方法)。我认为服务将是一个不错的选择,但我不确定我是否会遇到与此处相同的问题:防止数据在无法接收时丢失。但是当我想在片段的onAtach() 方法中重新发送 UpdateBundles,缓冲区始终为空。
到目前为止我已经尝试过:
-
volatileupdateBuffer 列表上的声明 - updateBuffer 列表上的Collections.synchronizedList
- 确保片段不再创建/两次
- 将 updateBuffer 放入 AsyncTask 中
- ...
但在我投入太多时间之前,我想知道我的方法是否可行以及何时可行。
提前致谢!
【问题讨论】:
标签: java android android-asynctask fragment