Loader和LoaderManager - 如何确定当前Loader是否处于活动状态并正在运行?

时间:2012-03-01 23:33:54

标签: android android-loadermanager

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

3 个答案:

答案 0 :(得分:2)

有两种可能的情况:

第一案

如果你使用唯一的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);

我在此处发布的关键原因 - 在将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()检查它是否正在运行。