8

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我就应该重新启动那些任务。

还有什么我应该做的吗?

谢谢,

4

7 回答 7

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();
于 2013-05-27T08:39:16.427 回答
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.

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

于 2012-07-20T23:01:39.990 回答
2

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

于 2012-07-20T20:59:38.037 回答
0

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

protected void onPostExecute(Void result) {

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

}
于 2014-05-29T11:58:20.667 回答
0

尝试将此代码放入onResume()

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

当您恢复到您的Activity. 您没有发布它,但可能正在创建onCreate()只运行一次的对象。

我对处理Socket连接的建议是仅对Thread自身进行子类化。

于 2012-07-20T21:22:34.383 回答
0

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

只需使用:newconnectTask.execute(); 在您确切想要重新启动任务的地方使用它!

于 2017-08-03T16:55:02.307 回答
0

开发者网站说

首次引入时,AsyncTask 在单个后台线程上串行执行。从 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) 方法来解决问题。

于 2017-06-01T20:57:27.413 回答