Как выполнять Asyntask одна из-за одной?

Я ищу еще раз Вашей помощи, у меня есть определенное число Asyntask чтобы выполнять, в этом случае это два различных задания, одна - это, чтобы сохранять и другая, чтобы обновлять, деталь, которую я занимаю, состоит в том, чтобы они работали одна из-за одной.

Образец кода, который я использую, - следующий:

    int id = 0;
    int id2 = 0;
    String  mqry = "select * from objeto where UpdateToServer = 1";
    Cursor crp = db.rawQuery(mqry,null);
    if(crp.getCount() > 0){
        while(crp.moveToNext()){
            id = crp.getInt(crp.getColumnIndex("_id"));
            id2 = crp.getInt(crp.getColumnIndex("id2"));
            if(id2 == 0){
                SaveObjeto sObj = new SaveObjetor();
                sObj.execute(id);
            }else {
                UpdateObjeto uProd = new UpdateObjeto();
                uObj.execute(id);
            }
        }
    }

Такой он такой, как я выполняю все те, кого я желаю, в этом случае, который у поля есть 1 в базе данных.

Я читал и исследовал немного и я нашел класс, который возможно делал бы то, что я желаю, но не понимаю очень хорошо Класс Executor: Кто использовал ее????

2
задан 13.09.2016, 18:44
2 ответа

В твоем случае он не подал бы Executor, так как ты был бы должен завертывать каждое повторение loop внутри задания в себя, чтобы мочь упорядочивать это.

Твой случай в действительности гораздо проще, используя AsyncTask.get () замораживается настоящий трэд до тех пор, пока AsyncTask не возвратит результат.

Важно: не называть это с главного трэда (UI) app, так как это может блокировать из-за некоторых секунду и вызывать ANR.

EDIT: Я добавляю пример к заказу @webserveis, в действительности он очень простой:

new DownloadFilesTask().get(5000, TimeUnit.MILLISECONDS);

будешь называть мой Asyctask точно, равно как если бы он позвонил

new DownloadFilesTask().execute()

С различием дело в том, что get будет останавливать настоящий трэд (в этом случае, с предельным временем 5 секунд) до тех пор, пока Task не завершит Ваше выполнение, в сущности ты конвертируешь задание в синхронной.

2
ответ дан 24.11.2019, 13:24
  • 1
    интересный, что ты комментируешь, имеешь какой-то согрешите и # 241; или пример использования? – Webserveis 13.09.2016, 23:15

если поиски, что твои Asynctask были последовательными, я верю в это, что правильное serГ, - чтобы использовать Гєnico Asynctas или Thread, который реализовывал бы 2 задания, эти осуществились бы последовательно.

Прокомментирует что-то, что ты можешь видеть в документации относительно Asynctask , когда добавил этот класс в SDK изначально, они работали в серии в том же thread, но когда вмешалась операционная система 3.0 Honeycomb , было позволено уже работать в параллели.

Восток точно - метод, который мы реализуем для вышеупомянутого задания, это, чтобы вынуждать не импортируя операционную систему, они будут работать в параллели>

public static void runParallelAsyncTask(AsyncTask task){
    if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB){
        task.execute();
    }else{
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
}

, Если ты хочешь, чтобы они осуществились в серии, ты можешь использовать вместо THREAD_POOL_EXECUTOR использовать SERIAL_EXECUTOR

, Для которого ты желаешь, можешь использовать метод .get () , чтобы вынуждать останавливать твою программу до тех пор, пока он не закончит выполнение Asynctask , но это спровоцирует, что задерживается UI конечно, я считаю, что он был бы лучшим выбором, чтобы добиваться, чтобы они были последовательными, иметь единственного Asynctask и добавлять выполнение заданий внутри того же самого.

1
ответ дан 24.11.2019, 13:24