【问题标题】:Prevent onProgressUpdate() data from beeen lost after Fragment detach()防止 onProgressUpdate() 数据在 Fragment detach() 后丢失
【发布时间】:2014-10-15 01:06:36
【问题描述】:

目前我使用一个简单的 Fragment 附加 AsyncTask 和 setRetainInstance(true) 来处理运行时配置更改和直接从 AsyncTask 到 MainActivity 的回调接口。 (following this example)。到目前为止,这工作正常。

但我的问题是数据onProgressUpdate 传递,一旦片段被分离(例如切换到主屏幕时)就会丢​​失。我的解决方案是在 Fragment 中创建缓冲区变量,用于存储 AsyncTask 中丢失的数据,直到再次附加该 Fragment。

公共类 MyFragment 扩展 SherlockFragment { 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,缓冲区始终为空。

到目前为止我已经尝试过:

  • volatile updateBuffer 列表上的声明
  • updateBuffer 列表上的Collections.synchronizedList
  • 确保片段不再创建/两次
  • 将 updateBuffer 放入 AsyncTask 中
  • ...

但在我投入太多时间之前,我想知道我的方法是否可行以及何时可行。

提前致谢!

【问题讨论】:

    标签: java android android-asynctask fragment


    【解决方案1】:

    反正我修好了。我将 AsyncTask 附加到应用程序任务并完全删除了 Fragment。

    这也是处理任何配置更改或消失的活动的好方法。我不需要保存任何数据,我只是读取我的缓冲区并将它们传递给回调并具有与以前相同的 exact 状态!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2021-09-02
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多