gpt4 book ai didi

android - 同步服务运行后刷新 FragmentActivity 中的 fragment

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:59 25 4
gpt4 key购买 nike

FragmentActivity ViewPager同步后,有没有人有任何优雅的解决方案来刷新Fragments中的Views SyncAdapter 中的 Service 运行了吗?

我试过在我的适配器上调用 notifyDataSetChanged()notifyDataSetInvalidated(),以及在我的 View 上调用 refreshDrawableState()( GridViews),但无济于事。也许我一直从错误的地方调用它们——我已经尝试在 setUserVisibleHint 中执行此操作,其中 isVisible=true,希望在 fragment 进入 View 时触发它, 但它不起作用。

我也一直在使用对 SQLite 数据库的 ASync 调用来满足我的数据需求,而不是使用 Content Provider,我认为这样做会更容易一些。我可以想出几种没有 Content Provider 的方法,但都不是很好。

有什么想法吗?如果需要,我可以提供代码。谢谢。

最佳答案

我假设您使用 AsyncTask 来加载游标只是为了解释,但如果您使用加载器、ThreadPool 或其他任何东西,它的工作方式是一样的。

在服务中,只要新数据发生更改,我就会发送一个 LocalBroadcast。 Activity 可能存在也可能不存在,因此广播是让它知道有新数据的好方法。所以从服务中你会做:

    // that's an example, let's say your SyncAdapter updated the album with this ID
// but you could create a simply "mybroadcast", up to you.
Intent i = new Intent("albumId_" + albumId);
LocalBroadcastManager.getInstance(this).sendBroadcast(i);

然后从具有 Cursor 的 Activity/fragment 中,您将像这样收听此广播:

    public void onResume(){
// the filter matches the broadcast
IntentFilter filter = new IntentFilter("albumId_" + albumId);
LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, filter);
}
public void onPause(){
LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver);
}

// and of course you have to create a BroadcastReceiver
private BroadcastReceiver myReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent){
// here you know that your data have changed, so it's time to reload it
reloadData = new ReloadData().execute(); // you should cancel this task onPause()
}
};

正如我所说,下一部分根据您用来加载 Cursor 的线程方法而有所不同,对于这个示例,我将在 AsyncTask 中展示,因为它非常流行(但我真的相信您和world 应该使用 Loaders 模式)。

private class ReloadData extends AsyncTask<Void, Void, Cursor> {
protected Cursor doInBackground(Void... void) {
// here you query your data base and return the new cursor
... query ...
return cursor;
}

protected void onPostExecute(Cursor result) {
// you said you're using a subclass of CursorAdater
// so you have the method changeCursor, that changes the cursor and closes the old one
myAdapter.changeCursor(result);
}

上述方法我之前测试和使用过,我知道它有效。有一种方法可以让它与标志 FLAG_REGISTER_CONTENT_OBSERVER 一起使用并覆盖 onContentChanged() 以重新执行查询并交换光标,但我从未测试过它。它将是这样的:

使用构造函数初始化您的适配器 CursorAdapter(Context context, Cursor c, int flags) 传递标志 FLAG_REGISTER_CONTENT_OBSERVER 并覆盖 onContentChanged() .在 onContentChanged 中,您将像上面一样执行 AsyncTask。这样您就不必使用 LocalBroadcastManager,因为数据库会发出警报。该方法不是我的主要答案的原因是因为我从未测试过它。

请注意,autoRequery 已被弃用,并且不鼓励使用它,因为它在 UI 线程中执行数据加载。

编辑:

我刚刚注意到内容观察器是 API 11 的东西。您有两个选择:1 使用支持库:https://developer.android.com/reference/android/support/v4/widget/CursorAdapter.html或广播选项。

关于android - 同步服务运行后刷新 FragmentActivity 中的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com