如何查询 LoaderManager 以查看 Loader 当前是否正在运行?
问问题
4185 次
3 回答
3
这样做有两种可能的情况:
第一种情况
如果您使用唯一的 Loader或者您有多个但您不在乎其中一个正在运行:
getSupportLoaderManager().hasRunningLoaders()
第二种情况
您想知道某个特定Loader
的是否正在运行。SDK似乎不支持它,但是您可以轻松地自己实现它。
a)只需添加标志
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;
}
//...
}
b)并使用它(有点棘手):-)
SomeLoader loader = (SomeLoader) manager.<String[]>getLoader(ID);
Log.d(TAG, "isRunning: " + loader.isRunning);
我在这里发布它的关键原因 - 在将 a 转换Loader
为您的SomeLoader
.
提醒
如果您调用getSupportLoaderManager.restartLoader
当前任务(如果它正在运行),那么无论您做什么,都不会被杀死。所以下一步将是一个调用,onCreateLoader
它将创建一个新的Loader
. 因此,这意味着您可以同时拥有 2、3、4、5 个和更多相同的任务并行任务(如果您不以某种方式阻止它),这可能会导致电池耗尽和超出 CPU/网络负载。
于 2017-03-03T01:41:25.047 回答
1
我确实认为 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");
}
顺便说一句,只有当加载器没有在另一个线程中更改为其他类型时,强制转换变量才是安全的。如果在您的程序中,加载程序可以在另一个线程中更改,synchronized
则以某种方式使用关键字。
于 2018-01-31T13:26:29.120 回答
-1
采用:
getLoaderManager().getLoader(id)
如果存在则返回加载程序,然后调用isStarted()
以检查它是否正在运行。
于 2013-07-19T23:55:29.787 回答