Android重启AsyncTask

时间:2012-07-20 20:44:12

标签: android 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 个答案:

答案 0 :(得分:4)

对于将来会遇到这种情况的人来说,它可能会有所帮助。你可以添加一个方法:

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();

答案 1 :(得分:2)

这是正确的,您可以简单地创建一个新实例并执行它以重新开始。我想知道你在启动任务的功能是什么?在onResume()函数中启动它可能是个好主意,以防活动在返回前台之前没有被销毁。

答案 2 :(得分:2)

感谢您提供的很多帮助。我决定废除AsyncTask。我结束使用普通的可运行线程并使用处理程序将消息发布回UI线程。这是代码:

        // 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.

到目前为止这是有效的。再次感谢你。希望这有助于某人

答案 3 :(得分:0)

尝试将此代码放在onResume()中:

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

当您恢复到Activity时,它应该创建一个新对象。你没有发布它,但可能在onCreate()中创建了一个只运行一次的对象。

我对处理Socket连接的建议仅仅是Thread本身的子类。

答案 4 :(得分:0)

更好的是,使用OnPostExecute来触发任务的新实例。如果任务完成,它将触发。但是使用布尔值来阻止它每次都触发它

protected void onPostExecute(Void result) {

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

}

答案 5 :(得分:0)

开发者网站说

  

首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。

     

如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。

从HONEYCOMB开始,AsyncTask默认使用单个Executor来执行任务,然后一次运行一个任务。这意味着如果在任何活动(主线程上的任何地方)上调用myTask.execute()之后调用它,则第二次调用将等待调用doInBackground方法直到第一个任务完成。如果您的IsSocketConnected()方法没有立即返回,它将在主线程上的任何位置再次调用AsyncTask.execute()方法后阻止任何doInBackground()调用,直到当前任务完成。

如果你的isSocketConnected()使用任何阻塞操作,比如wait()或Thread.sleep(),你可以通过在onDestroy()回调中调用 myTask.cancel(true)来解决它到你的活动,这将抛出InterruptedException。只需确保在一个会导致线程退出doInBackground方法的地方捕获InterruptedException。

您还可以使用自定义 ThreadPoolExecutor 并调用AsyncTask.executeOnExecutor(Executor)方法来解决此问题。

答案 6 :(得分:0)

而不是使用: connectedTask = new myTask(); connectedTask.execute();

简单地使用: newconnectTask.execute(); 在你想要重新启动任务的地方使用它!