android - Fragment 和 Service 正在使用相同的资源

标签 android android-fragments android-service

我正在制作 Android 应用程序,用户可以在其中处理小图像。

应用程序有一个后端 (parse.com),图像位于其中,因此我可以添加和删除一些图像。 在客户端,图像存储在 SD(文件)上,文件路径所在的 sqlite 表。

App 有一个 Fragment,它获取所有可用的图像并在带有 ImageView 的 GridView 中显示它们。我正在使用 SQLiteCursorLoader/CursorAdapter 获取文件路径,然后将位图加载到 ImageViews。
我还有 IntentService,它通过计时器将图像与后端同步。它加载并保存到 SD 新图像并删除已删除的图像文件。它还使用图像的文件路径修改 sqlite 表。

问题是:IntentService 可以在用户使用 Fragment 的同时开始做他的工作。用户可以选择已经被 IntentService 删除的图像。

IntentService 是否有可能检查 Fragment(或其他数据消费者)是否正在工作?在这种情况下,IntentService 是否应该停止工作? 是否有解决此类问题的“良好做法”?

如有任何帮助,我将不胜感激

最佳答案

让您的 UI 与您的数据库保持同步的首选方法是使用 Content Provider 实现内容可观察模式并使用 Loader Manager 观察变化.

你的 fragment 看起来像这样:

public class SomeFragment extends Fragment 
    implements LoaderManager.LoaderCallbacks<Cursor> {
    private CursorAdapter mAdapter;
    // ...
    @Override public void onViewCreated(View view) {
        // ...
        mAdapter = new ResourceCursorAdapter(getActivity(), R.layout.my_layout, null, false);
        // attach adapter to your grid-view...

        getLoaderManager().initLoader(0, null, this);
    }

    @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(getActivity(), MY_IMAGE_MODEL_URI, null, null, null, null);
    }

    @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        // this automatically reloads your adapter and updates your grid-view
        mAdapter.swapCursor(cursor); 
    }

    @Override public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    }
}

请注意,将观察传递给 CursorLoader 的 Uri 是否发生变化。当检测到变化时,Loader 将查询指定的 Uri,然后调用 onLoadFinished。但它只能在您通知系统该 Uri 发生更改时检测到更改。在完成更新、插入或删除之后,您通常会在内容提供者内部执行此操作。但它也可以在您的 IntentService 删除、插入或更新您的数据后完成。

执行此操作的代码如下所示:

getContentResolver().notifyChange(MY_IMAGE_MODEL_URI, null);

关于android - Fragment 和 Service 正在使用相同的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26293342/

相关文章:

java - 无法在android中启动网络服务器服务

android - 如何在 Android 中停止来自 BroadcastReceiver 的服务?

java - 制作一个应用程序,只要打开应用程序就开始录音

java - findFirstVisibleItemPosition 不适用于 recyclerview android

android - 如何在 Android Google Maps API v2 上管理多边形的 InfoWindows

android - 始终在 Android 中使用 fragment

java - Fragment中使用ListView时适配器不调用getView()

android - camera.setParameters 在 android 中失败

android - 无法从 fragment 中获取父 View

java - 如何确保我的 Android 应用程序不会同时访问文件?