Loader и LoaderManager - как определить, активен ли текущий загрузчик и работает ли он? - PullRequest
9 голосов
/ 02 марта 2012

Как вы можете запросить LoaderManager, чтобы узнать, запущен ли сейчас Loader?

Ответы [ 3 ]

2 голосов
/ 03 марта 2017

Есть две возможные ситуации:

1-й случай

Если вы используете единственный Loader или у вас их несколько, но вам все равно, какой из них запущен:

getSupportLoaderManager().hasRunningLoaders()

2-й случай

Вы хотите знать, работает ли какой-то конкретный 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 и более одинаковых задач, параллельных задач вместе (если вы не помешаете этому каким-либо образом), которые могут привести к разрядке батареи и превышению загрузки ЦП / сети.

0 голосов
/ 31 января 2018

Я думаю, что у Славы есть хорошее решение, но у меня есть улучшение для его «хитрой» части:

Создать интерфейс:

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.

0 голосов
/ 20 июля 2013

Использование:

getLoaderManager().getLoader(id)

, если существует, вернуть загрузчик, затем вызвать isStarted(), чтобы проверить, работает ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...