10

如何查询 LoaderManager 以查看 Loader 当前是否正在运行?

4

3 回答 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 回答