我正在尝试为执行某些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不兼容?文档没有提供相关信息.
我试图通过几种方式解决这个问题,但似乎没有任何方法可行:
有谁知道为什么getLoaderResultSynchronously不接受加载器?或者另一种测试Loader的干净方法,包括测试返回数据的方法?我可以在单独的情况下测试处理返回数据,但我还想测试实际数据.
此致
我有两个加载器,一个用于填充绑定返回的数据到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) 因为,一直存在一些问题AsyncTask.所以,现在,我正在考虑转向Loader或Headless Fragments.
我的应用程序是一个社交媒体应用程序,人们评论,发布,喜欢和做更多的事情.每个活动从服务器获取图像,我必须缓存它们.要处理运行时配置更改,哪个更适合此应用程序.装载机或无头碎片.
我将处理每个陷阱,例如从服务器加载数据并且活动进入onStop()或onPause()状态.救命!
android android-asynctask android-fragments android-cursorloader android-loader
我不明白所做的所有功能AsyncTaskLoader,例如onCancelLoad()和onForceLoad().所有功能及其调用顺序均未正确记录.
假设我想在后台下载文件并在需要时取消它.onCancelLoad()已经有了 什么目的cancelLoadInBackground().
android android-asynctask asynctaskloader android-loadermanager android-loader
装载机是否可以在没有内容提供商的情
最佳做法是仅在打算供其他应用程序使用内容时使用内容提供程序,还是仅建议本地使用内容提供程序?
如果在SQLite中更新数据,Will loader会提供更新的数据,如果不与内容提供商一起使用?
我试图找到令人信服的上述问题的答案,但找不到它.请帮忙.
代码:
首先是我的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
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)
传递的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 …
我有一个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
我使用扩展的类Loader.
得到结果后如何停止装载机?
当我旋转手机时,我再次得到结果:
@Override
public void onLoadFinished(Loader<Data> loader, Data data) {
makeWorkWithData();
//... finish this loader? (or delete result)
}
Run Code Online (Sandbox Code Playgroud) 这个问题将是一个问题内容解析器与光标加载器的后续问题. 答案清楚地说明了如何使用内容解析器将记录插入到sqlite Db中.我的问题如下:
例如:
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进行插入操作的正确资源(我看过很多带有查询示例的例子,它可以工作喜欢魅力:))
感谢您的时间 .
我想在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>
然后检查回调方法它是什么类型的对象,但这似乎并不太优雅.有没有更好的办法?
当我尝试使用非静态内部Loader类时,我收到以下运行时错误:
从onCreateLoader返回的对象不能是非静态内部成员类
这个限制有什么意义?
根据Android文档,Android P中不推荐使用AsyncTaskLoader。有人可以告诉我为什么不推荐使用AsyncTaskLoader吗?
编辑-Google现在建议使用ViewModel而不是Loader,这是它们被弃用的原因
android background asynctaskloader android-loader android-9.0-pie