标签: android-loader

使用getLoaderResultSynchronously对AsyncTaskLoader进行单元测试

我正在尝试为执行某些API调用的REST客户端创建单元测试.客户端在实时应用程序中工作正常,但我不能让它在测试用例中运行.

显然,可以在这里使用LoaderTestCase.getLoaderResultSynchronously()(至少根据Android参考,但它不会接受我的加载器.代码:

public void testGetEventInfo() {
    // Init some vars
    ...

    // Create & execute loader
    RESTLoader loader = new RESTLoader(getContext(),
            RESTLoader.HTTPVerb.GET, action, params, LOADER_GET_NEWS);
    getLoaderResultSynchronously(loader);
}
Run Code Online (Sandbox Code Playgroud)

这会产生错误,类型LoaderTestCase中的getLoaderResultSynchronously(Loader)不适用于参数(RESTLoader).

RESTLoader扩展了AsyncLoader.请注意,我正在使用supportlibrary,也许那里的Loader不兼容?文档没有提供相关信息.

我试图通过几种方式解决这个问题,但似乎没有任何方法可行:

  • 注册了一个加载器的监听器.但是,回调永远不会触发
  • 使用CountdownLatch(也有一个监听器).同样,没有触发/倒计时超时.
  • 使用类型模板(),但没有成功.
  • 关于SO的类似解决方案,虽然再次未能达到听众.

有谁知道为什么getLoaderResultSynchronously不接受加载器?或者另一种测试Loader的干净方法,包括测试返回数据的方法?我可以在单独的情况下测试处理返回数据,但我还想测试实际数据.

此致

junit android android-loader

5
推荐指数
1
解决办法
1487
查看次数

使用LoaderManager的多个装载程序,而不是正确的装载程序

我有两个加载器,一个用于填充绑定返回的数据到2 TextViews,另一个用于填充a ListView.如何确保为每种情况加载正确的装载程序?我在第一个加载器(WR_VIEWcase)似乎没有创建或加载的地方出现错误,因此onLoadFinished()它返回"没有这样的列发现错误",因为它正在访问不调用该列的第二个加载器.

在我的onCreate方法中,我为列表视图设置了适配器:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.workouts_options);

    String[] uiBindFrom = { ExerciseTable.COLUMN_NAME };
    int[] uiBindTo = { R.id.text1 };

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(
        getApplicationContext(), 
        R.layout.exercises_row, 
        null, 
        uiBindFrom, 
        uiBindTo,
        CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);    

    final ListView lv = (ListView) findViewById(android.R.id.list);

    lv.setAdapter(adapter);
    lv.setEmptyView(findViewById(android.R.id.empty));
    lv.setClickable(true);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
        }
    });

    getSupportLoaderManager().initLoader(WR_VIEW, null, this);
    getSupportLoaderManager().initLoader(EXERCISE_VIEW, null, this);
}
Run Code Online (Sandbox Code Playgroud)

创建我的2个不同的CursorLoaders:

    public Loader<Cursor> …
Run Code Online (Sandbox Code Playgroud)

android android-loadermanager android-loader

5
推荐指数
1
解决办法
3856
查看次数

哪一个更好:装载机或无头碎片

因为,一直存在一些问题AsyncTask.所以,现在,我正在考虑转向Loader或Headless Fragments.

我的应用程序是一个社交媒体应用程序,人们评论,发布,喜欢和做更多的事情.每个活动从服务器获取图像,我必须缓存它们.要处理运行时配置更改,哪个更适合此应用程序.装载机或无头碎片.

我将处理每个陷阱,例如从服务器加载数据并且活动进入onStop()onPause()状态.救命!

android android-asynctask android-fragments android-cursorloader android-loader

5
推荐指数
1
解决办法
670
查看次数

解释AsyncTaskLoader

我不明白所做的所有功能AsyncTaskLoader,例如onCancelLoad()onForceLoad().所有功能及其调用顺序均未正确记录.

假设我想在后台下载文件并在需要时取消它.onCancelLoad()已经有了 什么目的cancelLoadInBackground().

android android-asynctask asynctaskloader android-loadermanager android-loader

5
推荐指数
1
解决办法
727
查看次数

装载机是否可以在没有内容提供商的情

  1. 装载机是否可以在没有内容提供商的情

  2. 最佳做法是仅在打算供其他应用程序使用内容时使用内容提供程序,还是仅建议本地使用内容提供程序?

  3. 如果在SQLite中更新数据,Will loader会提供更新的数据,如果不与内容提供商一起使用?

我试图找到令人信服的上述问题的答案,但找不到它.请帮忙.

android android-contentprovider android-loader

5
推荐指数
1
解决办法
1096
查看次数

android getContentResolver().notifyChange()不重启我的加载器

代码:

首先是我的Uris

public static final String PACKAGE    = "my.url.contentprovider";

public static final String TABLE_NAME = "NetworkTransaction";

public static final String AUTHORITY  = PACKAGE + ".NetTransContentProvider";

public static final Uri BASE_URI = Uri.parse("content://"+AUTHORITY);

public static final Uri CONTENT_URI_ANY_OBSERVER  = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/*");

public static final Uri CONTENT_URI_FIND_BY_ID  = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/FIND/ID");

public static final Uri CONTENT_URI_INSERT_OR_REPLACE_BY_ID    = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/INSERT/REPLACE/ID"); 

public static final Uri CONTENT_URI_INSERT_BY_ID   = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/INSERT/ID"); 
Run Code Online (Sandbox Code Playgroud)

和我的活动代码加载器:

@Override
protected void onResume() {
    super.onResume();
getSupportLoaderManager().restartLoader(NET_TRANS_LOADER_ID,mBundle,this).forceLoad();

}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
    Uri uri = …
Run Code Online (Sandbox Code Playgroud)

android android-contentresolver android-contentprovider android-loadermanager android-loader

4
推荐指数
1
解决办法
2041
查看次数

CursorLoader连接到错误的ContentProvider

问题

CursorLoader实例化似乎使用以前的CursorLoader的URI,而不是作为参数传入的URI.

CursorLoader cursor = new CursorLoader(this, FLASHCARD_CONTENT_URI, 
FLASHCARD_FROM, null, null, null);
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

no such column: front (code 1): , while compiling: 
SELECT _ID, front, back, FROM deck
Run Code Online (Sandbox Code Playgroud)

课程

  1. DeckIndex.java - 负责查询数据库"deck"表并返回游标的Cursor数组.
  2. DeckShow.java - 负责查询数据库"flashcard"表并返回一个Cursor数组的flashcards.
  3. AuducardOpenHelper.java - 负责数据库的DDL和创建.
  4. DecksProvider - 负责"甲板"表的CRUD
  5. FlashcardsProvider - 负责"flashcard"表的CRUD

说明

传递的URI:

public static final Uri FLASHCARD_CONTENT_URI = 
Uri.parse("content://" + AUTHORITY + "/" + FLASHCARD_TABLE_NAME);
Run Code Online (Sandbox Code Playgroud)

我知道这是由DecksProvider而不是FlashcardsProvider处理的事实.

和FlashcardsProvider中的UriMatcher:

@Override
public boolean onCreate(){
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(AUTHORITY, "flashcard", FLASHCARDS);

    auducards = new AuducardOpenHelper(getContext());
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我认为重要的是要提到首先调用DecksIndex类,因此成功完成对DeckProvider的调用.直到我在调用DeckShow …

android android-contentprovider android-loader

3
推荐指数
1
解决办法
573
查看次数

除非我在loadInBackground中返回一个新对象,否则AsyncTaskLoader不会调用onLoadFinished

我有一个AsyncTaskLoader<List<String>>成员变量List<String>mAddresses.在loadInBackground,如果我创建一个新对象,填充它,并返回它; onLoadFinished按预期调用,所以我可以更新适配器,然后更新视图.

    public List<String> loadInBackground()
    {
        // ListView updates properly only if I do this (strange?)
        mAddresses = new ArrayList<String>();

        // ... fill mAddresses ...

        return mAddresses;
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用相同的变量,即使它的值发生变化也会onLoadFinished被调用:

    public List<String> loadInBackground()
    {
        // ListView does not update with this!
        if(mAddresses == null)
        {
           mAddresses = new ArrayList<String>();
        }

        // ... fill mAddresses ...

        return mAddresses;
    }
Run Code Online (Sandbox Code Playgroud)

任何人都可以评论这个吗?我是否应该像这样创建一个新对象来返回?是否有任何标志我可以设置"对象已更改,所以即使它是同一个对象,请确保执行所有更新?

android asynctaskloader android-loadermanager android-loader

3
推荐指数
1
解决办法
2504
查看次数

如何正确停止装载机?

我使用扩展的类Loader. 得到结果后如何停止装载机?

当我旋转手机时,我再次得到结果:

@Override
public void onLoadFinished(Loader<Data> loader, Data data) {
      makeWorkWithData();
      //... finish this loader? (or delete result)
}
Run Code Online (Sandbox Code Playgroud)

android android-loader

3
推荐指数
1
解决办法
2835
查看次数

在android中通过Loaders插入记录

这个问题将是一个问题内容解析器与光标加载器的后续问题. 答案清楚地说明了如何使用内容解析器将记录插入到sqlite Db中.我的问题如下:

  1. 我可以使用加载程序(Normal Loader)来实现此功能吗?

例如:

    public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
            switch (id) {

    case AppConstants.LOADER_ADD_FAV_PHONE_NUM:

        ContentValues values = new ContentValues();
        values.put(DBHelper.TM_DB_COLUMN_PHONE_NUMBER,
                directionOrder);
        values.put(TransitMeDBHelper.TM_DB_COLUMN_NAME_ID, selectionArgs[0]);
        Uri insertFavStop =getContentResolver().insert(TransitMeContentProvider.CONTENT_URI_INSERT_FAV_PHONE,
                        values);
        break;
    }

return null;
}
Run Code Online (Sandbox Code Playgroud)

这会运行主UI线程或工作线程中的功能吗?我知道我不会收到回调,因为内容解析器将返回URI而不是包含数据的游标.

我尝试运行此代码,但它表现得有点奇怪..重复插入被记录,它不是很有意义,有人可以向我展示一些使用Loader进行插入操作的正确资源(我看过很多带有查询示例的例子,它可以工作喜欢魅力:))

感谢您的时间 .

sqlite android insert android-loader

2
推荐指数
1
解决办法
2328
查看次数

在一个Activity中使用不同的(AsyncTask)加载器

我想在Activity中使用不同的AsyncTaskLoader(返回类型不同),实现回调方法的最佳方法是什么?

这不起作用:

公共类MyActivity扩展Activity实现LoaderManager.LoaderCallbacks <MyPojo>,LoaderManager.LoaderCallbacks <MyOtherPojo>

Eclipse说

The interface LoaderCallbacks cannot be implemented more than once with different arguments
Run Code Online (Sandbox Code Playgroud)

那我该怎么办?我的想法是制作活动

实现LoaderManager.LoaderCallbacks <Object>

然后检查回调方法它是什么类型的对象,但这似乎并不太优雅.有没有更好的办法?

android asynctaskloader android-loader

2
推荐指数
1
解决办法
1415
查看次数

为什么加载器不能成为非静态内部类?

当我尝试使用非静态内部Loader类时,我收到以下运行时错误:

从onCreateLoader返回的对象不能是非静态内部成员类

这个限制有什么意义?

android android-loadermanager android-loader

2
推荐指数
1
解决办法
1025
查看次数

为什么在Android P中不推荐使用AsyncTaskLoader?

根据Android文档,Android P中不推荐使用AsyncTaskLoader。有人可以告诉我为什么不推荐使用AsyncTaskLoader吗?

编辑-Google现在建议使用ViewModel而不是Loader,这是它们被弃用的原因

android background asynctaskloader android-loader android-9.0-pie

0
推荐指数
1
解决办法
1455
查看次数