Асинхронная задача

#android

#Android

Вопрос:

Я создал асинхронную задачу, подобную этой:

 private class LongOperationcheckall extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        String result="Start";
        try
        {
            Looper.myLooper().prepare();
            // Looper.loop();

            // TODO Auto-generated method stub
            for(int k=0;k<13;k  )
            {
                checkall();
                this.publishProgress("Show the dialog");

                //count  ;
            }

            result="Success";
            checkallcomp  ;

            OnscanComplete();
        }
        catch(Exception ex)
        {
            checkallcomp  ;
            OnscanComplete();
        }
        return resu<
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
        Log.i("Progress", "Progressincheck");
    }

    protected void onPostExecute(String params ) {
        Log.w("all Check",params);

        // Execution of result of Long time consuming operation
    }
}
 

Я добавил код,

 Looper.myLooper().prepare();
 

для вызова этой задачи как

 taskAllcheck = new LongOperationcheckall();
taskAllcheck.execute();
 

В четвертый раз, когда я нажимаю на кнопку «Пуск» в четвертый раз, это выдает исключение

Не удается создать обработчик внутри потока внутри потока, который не вызывается looper.prepare

Только, когда я запускаю устройство, оно выполняется нормально в эмуляторе, но после добавления этой строки появляется ошибка, поскольку для каждого потока может быть создан только один цикл, когда я нажимаю на кнопку «Пуск» в четвертый раз и вызываю taskAllcheck.execute(); .

Комментарии:

1. Что делает метод checkall()? исключение «Не удается создать обработчик …» обычно возникает, когда вы пытаетесь сделать что-то, что разрешено делать только в потоке пользовательского интерфейса, в фоновом потоке.

2. checkall () проверяет только такие настройки, как включение или выключение Bluetooth, включение или выключение gps на устройстве, и обновляет статус в соответствии с ним в базе данных

3. Вот о чем я говорю. Возможно, это операции, которые должны выполняться в потоке пользовательского интерфейса. Вы можете поместить их в Runnable в метод activity.runOnUiThread(), таким образом вы преодолеете исключение Looper .

Ответ №1:

Пожалуйста, думайте об асинхронном потоке как о потоке пользовательского интерфейса, который имеет встроенный обработчик для обновления вашего пользовательского интерфейса. Несмотря ни на что, это поток. Итак, теперь это очищено, я не вижу, где вы на самом деле написали checkall() функцию. Функция check all должна быть локальной методологией для вызова асинхронной задачи в фоновом режиме. Это не может быть методом в вашем основном классе. Если это так, то нет смысла иметь асинхронную задачу. Поэтому, пожалуйста, добавьте checkall() функцию в свою асинхронную задачу.

Далее, в асинхронной задаче нет необходимости в цикле. За обработку данных отвечает:

this.publishProgress(«Показать диалоговое окно»);

Пожалуйста, убедитесь, что вы передаете все, что хотите. int string boolean В этом можно обрабатывать либо , , , , array либо что угодно и все. Поэтому разумно используйте реализацию.

Теперь сделайте внутреннюю onProgressUpdate() часть соответствующим образом и, следовательно, также, пожалуйста, проверьте это, если вы хотите, чтобы что-то из потока пользовательского интерфейса выполнялось, например, методы или что-то в этом роде. Это можно сделать с помощью этого метода.

Теперь внесите изменения, о которых я вам сказал. Пожалуйста, перезвоните мне, и я буду в лучшем положении, чтобы работать с вами. Если мы сможем точно определить проблему. Будьте осторожны.