我试图在Android上实现一个加载器示例,但无法让它启动加载器.我使用以下代码.它将点击"Create Loader",但它永远不会到达"正在加载"日志消息.我错过了我需要的电话吗?
活动:
public class TestingZoneActivity extends ListActivity implements LoaderCallbacks<ArrayList<Content>>{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<ArrayList<Content>> onCreateLoader(int id, Bundle args) {
Log.e("TEST", "Create Loader");
return new ImageLoader(this);
}
@Override
public void onLoadFinished(Loader<ArrayList<Content>> loader, ArrayList<Content> data) {
setListAdapter(new ImageAdapter(this, data));
}
@Override
public void onLoaderReset(Loader<ArrayList<Content>> loader) {
setListAdapter(null);
}
}
Run Code Online (Sandbox Code Playgroud)
装载机:
public class ImageLoader extends AsyncTaskLoader<ArrayList<Content>> {
public ImageLoader(Context context) {
super(context);
}
@Override
public ArrayList<Content> loadInBackground() {
Log.e("TEST", "Loading started");
}
}
Run Code Online (Sandbox Code Playgroud)
Ren*_*ard 128
我使用兼容性库时遇到了同样的问题.我通过电话解决了它forceLoad
getLoaderManager().initLoader(0, null, this).forceLoad();
Run Code Online (Sandbox Code Playgroud)
显然缺少AsyncLoader的文档,HoneyComb上也存在这个问题.更多信息可以在这里找到
AsyncTaskLoader 的官方示例也调用forceLoad(),因此它不是一个bug,但我仍然认为这种行为不是很直观.
小智 25
压倒loadInBackground()是不够的.
看一看在AppListLoader上http://developer.android.com/reference/android/content/AsyncTaskLoader.html.
至少将这两个方法添加到您的加载器:
@Override
protected void onStartLoading() {
if (takeContentChanged())
forceLoad();
}
@Override
protected void onStopLoading() {
cancelLoad();
}
Run Code Online (Sandbox Code Playgroud)
并onContentChanged()从其构造函数调用.
Kit*_*Kat 13
rrayst的建议非常紧凑.如果你这样写你的方法:
protected void onStartLoading() {
forceLoad();
}
Run Code Online (Sandbox Code Playgroud)
你会注意到当一个孩子的活动出现然后你回到父母的活动时,onStartLoading(等等loadInBackground)再次被召唤!
你能做什么?mContentChanged在构造函数中将内部变量()设置为true; 然后在里面检查这个变量onStartLoading.只有当它成立时才开始加载真实:
package example.util;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
public abstract class ATLoader<D> extends AsyncTaskLoader<D> {
public ATLoader(Context context) {
super(context);
// run only once
onContentChanged();
}
@Override
protected void onStartLoading() {
// That's how we start every AsyncTaskLoader...
// - code snippet from android.content.CursorLoader (method onStartLoading)
if (takeContentChanged()) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21848 次 |
| 最近记录: |