Android перезапустить AsyncTask

у меня возникли проблемы с перезапуском AsyncTask после того, как я пытаюсь возобновить активность.

когда я впервые открываю действие, я называю это, чтобы начать AsyncTask, который работает в первый раз.

myTask connectedTask;
connectedTask = new myTask();
connectedTask.execute();

public class myTask extends AsyncTask<Integer,Integer, Integer> {

    @Override
    protected Integer doInBackground(Integer... arg0) {
        //Increase timer and wait here in a loop
        System.out.println("ASYNC TASK STARTING!");
        return IsSocketConnected();
    }

    protected void onPostExecute(Integer result) {
        //Something you want to do when done?
        System.out.println("ASYNC TASK DONE!");

        // if it was connected successfully 
        if(result == 1) {
            // remove the progress bar
            proBar.setVisibility(View.GONE);

            // Discover available devices settings and create buttons
            CreateButtons(btnList);
        }
    }
}

IsSocketConnected(); // checks for a bluetooth connections to be done. 

когда я возвращаюсь к предыдущей деятельности и пытаюсь начать эту деятельность снова, я не могу получить AsyncTask начать снова.

Я читаю это, пока я создаю новый экземпляр AsyncTask Я должен перезапустить эти задачи.

есть что-то еще, что я должен делать?

спасибо,

7 ответов


вероятно, это может помочь кому-то, кто встретит это в будущем. Вы можете просто добавить метод:

public class MainActivity extends Activity {

     public static MyTask loadTextDataTask;

     //... methods

     public class MyTask extends AsyncTask<Void, Void, Void> {

         //... methods

         public void selfRestart() {
             loadTextDataTask = new MyTask();
         }
     }

}

затем вы можете использовать его из любого другого класса, как:

MainActivity.loadTextDataTask.selfrestart();

это правильно, вы можете просто создать новый экземпляр и запустить его, чтобы начать снова. Интересно, в какой функции вы запускаете задачу? Вероятно, было бы неплохо начать его в вашем onResume() функция, на всякий случай, если активность не будет уничтожена, прежде чем она вернется на передний план.


Спасибо за все ваши комментарии, они очень помогли. Я решил покончить с AsyncTask. Я закончил использовать обычный поток и использовать обработчики для отправки сообщений обратно в поток пользовательского интерфейса. вот код:

        // Start thread here only for IsSocketConnected
        new Thread(new Runnable() {

            public void run() {

                //Add your code here..
                IsSocketConnected();

            }
        }).start();


// handler that deals with updating UI
public Handler myUIHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        if (msg.what == Bluetooth.STATE_CONNECTED)
        {
            //Update UI here...
            Log.d(TAG, "Connected");




            // Discover available devices settings and create buttons
            CreateButtons(btnList);

        } else if(msg.what == Bluetooth.STATE_NONE) {

            Log.d(TAG, "NOT Connected");
        }

}

// in the IsSocketConnected() I call this 
Message theMessage = myUIHandler.obtainMessage(Bluetooth.STATE_CONNECTED);
myUIHandler.sendMessage(theMessage);//Sends the message to the UI handler.

это работает до сих пор. Спасибо еще раз. Надеюсь, это поможет кому-то


попробуйте ввести этот код в onResume() как:

@Override
public void onResume()
{
    super.onResume();
    myTask connectedTask = new myTask();
    connectedTask.execute();
}

он должен создать новый объект, когда вы вернетесь к своему Activity. Вы не опубликовали его, но, вероятно, создавали объект в onCreate() который запускается только один раз.

моя рекомендация по обращению Socket соединения - это просто подкласс .


лучше, используйте OnPostExecute, чтобы вызвать новый экземпляр задачи. Он выстрелит, если задание будет выполнено. Но используйте логическое значение, чтобы предотвратить его запуск каждый раз

protected void onPostExecute(Void result) {

if(someboolean==true) { 
                            new instance of task;
                            instance.execute;
                someboolean=false;
                }

}

сайт разработчика говорит

при первом введении AsyncTasks выполнялись последовательно в одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать распространенных ошибок приложения, вызванных параллельным выполнением.

Если вы действительно хотите параллельного выполнения, вы можете вызвать executeOnExecutor (java.утиль.параллельный.Executor, Object []) с помощью THREAD_POOL_EXECUTOR.

начиная с HONEYCOMB, AsyncTask использует один исполнитель по умолчанию для выполнения задач, который затем запускает одну задачу за раз. Это означает, что если вы называете майтаск.execute () после того, как вы уже вызвали его для любого действия (в любом месте основной нити), второй вызов будет ждать, чтобы вызвать метод doInBackground, пока первая задача не будет завершена. Если ваш IsSocketConnected() метод не возвращается сразу, он заблокирует любые вызовы doInBackground () после вызова AsyncTask.метод execute () снова в любом месте основного потока, пока текущая задача не завершится.

Если ваш isSocketConnected() использует любые блокирующие операции, такие как wait () или Thread.sleep(), вы можете обойти это, позвонив myTask.отмена (true) в обратном вызове onDestroy () к вашей активности, который вызовет исключение InterruptedException. Просто убедитесь, что вы поймали InterruptedException в месте, которое приведет к выходу потока из метода doInBackground.

вы также можете сделать обходной путь с помощью пользовательского ThreadPoolExecutor и вызов AsyncTask.executeOnExecutor(исполнитель) способ.


вместо использования: connectedTask = новый майтаск(); connectedTask.execute ();

просто использовать: newconnectTask.выполнять(); Используйте его там, где вы точно хотите перезапустить задачу!!