Android重启AsyncTask

jra*_*rez 7 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. 
Run Code Online (Sandbox Code Playgroud)

当我回到之前的活动并尝试再次开始这项活动时,我无法AsyncTask重新开始.

我读过,只要我创建一个新的实例,AsyncTask我应该重启那些任务.

我还应该做些什么吗?

谢谢,

car*_*l7j 5

很好,OP找到了解决方案,但为未来的读者提供了答案;

您可以添加一个方法,例如:

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();
         }
     }
Run Code Online (Sandbox Code Playgroud)

}

然后您可以从任何其他类中使用它,例如:

MainActivity.loadTextDataTask.selfrestart();
Run Code Online (Sandbox Code Playgroud)

请注意,没有真正的方法可以重新启动现有实例,即使我们调用AsyncTask.cancel(true),第二次调用也会AsyncTask.execute()抛出异常

IllegalStateException: Cannot execute task: the task has already been executed
Run Code Online (Sandbox Code Playgroud)


jra*_*rez 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");
        }
Run Code Online (Sandbox Code Playgroud)

}

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

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