如何查询LoaderManager以查看Loader当前是否正在运行?
答案 0 :(得分:2)
有两种可能的情况:
如果你使用唯一的Loader ,或者你有几个,但你并不关心其中一个正在运行:
getSupportLoaderManager().hasRunningLoaders()
您想知道某个特定Loader
是否正在运行。它似乎不受SDK支持,但您可以自己轻松实现它。
public class SomeLoader extends AsyncTaskLoader<String[]> {
public boolean isRunning;
@Override
protected void onStartLoading() {
isRunning = true;
super.onStartLoading();
//...
forceLoad();
}
@Override
public void deliverResult(String[] data) {
super.deliverResult(data);
isRunning = false;
}
//...
}
SomeLoader loader = (SomeLoader) manager.<String[]>getLoader(ID);
Log.d(TAG, "isRunning: " + loader.isRunning);
我在此处发布的关键原因 - 在将Loader
投射到SomeLoader
之前,这是一个非常棘手的泛型方法调用。
如果你打电话getSupportLoaderManager.restartLoader
当前的任务(如果它正在运行)没有被杀死,你做什么。因此,下一步将是onCreateLoader
的调用,这将创建一个新的Loader
。因此,这意味着您可以将2,3,4,5个相同的任务并行任务放在一起(如果您不以某种方式阻止它们),这可能导致电池耗尽和超出CPU /网络负载
答案 1 :(得分:0)
我确实认为Slava有一个很好的解决方案,但我对他''棘手'的部分有所改进:
创建一个界面:
public interface IRunnableLoader {
boolean IsRunning();
}
让SomeLoader
类实现接口:
public class SomeLoader extends AsyncTaskLoader<String[]> implements IRunnableLoader {
private boolean isRunning;
public SomeLoader(Context context) {
super(context);
}
@Override
protected void onStartLoading() {
isRunning = true;
super.onStartLoading();
//...
forceLoad();
}
@Override
public void deliverResult(String[] data) {
super.deliverResult(data);
isRunning = false;
}
@Override
public boolean IsRunning() {
return isRunning;
}
//...
}
...并像这样使用它:
Loader<String> loader = getSupportLoaderManager().getLoader(TASK_ID);
if (loader instanceof IRunnableLoader && ((IRunnableLoader)loader).IsRunning()) {
Log.d(TAG, "is Running");
}
else {
Log.d(TAG, "is not Running");
}
BTW仅当加载程序未更改为另一个线程中的某个其他类型时,才能安全地转换变量。如果在您的程序中,加载程序可以在另一个线程中更改,则以某种方式使用synchronized
关键字。
答案 2 :(得分:-1)
使用:
getLoaderManager().getLoader(id)
如果存在则返回加载程序,然后调用isStarted()
检查它是否正在运行。