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

そうです、新しいインスタンスを作成して実行するだけで、最初からやり直すことができます。どの機能でタスクを開始しているのでしょうか。onResume()アクティビティがフォアグラウンドに戻る前に破棄されない場合に備えて、関数で開始することをお勧めします。

于 2012-07-20T20:59:38.037 に答える
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 に答える
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

より良いのは、OnPostExecuteを使用して、タスクの新しいインスタンスをトリガーすることです。タスクが完了すると起動します。ただし、ブール値を使用して、毎回トリガーされないようにします

protected void onPostExecute(Void result) {

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

}
于 2014-05-29T11:58:20.667 に答える
0

開発者のウェブサイトは言う

最初に導入されたとき、AsyncTasksは単一のバックグラウンドスレッドでシリアルに実行されていました。DONUT以降、これはスレッドのプールに変更され、複数のタスクを並行して操作できるようになりました。HONEYCOMB以降、並列実行によって引き起こされる一般的なアプリケーションエラーを回避するために、タスクは単一スレッドで実行されます。

本当に並列実行が必要な場合は、THREAD_POOL_EXECUTORを使用してexecuteOnExecutor(java.util.concurrent.Executor、Object [])を呼び出すことができます。

HONEYCOMB以降、AsyncTaskはデフォルトで単一のエグゼキューターを使用してタスクを実行します。エグゼキューターは一度に1つのタスクを実行します。つまり、アクティビティ(メインスレッドの任意の場所)でmyTask.execute()を呼び出した後で、2番目の呼び出しは、最初のタスクが完了するまで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 に答える
0

使用する代わりに:connectedTask = new myTask(); connectedTask.execute();

単に使用してください:newconnectTask.execute(); 正確にタスクを再開したい場所で使用してください!!

于 2017-08-03T16:55:02.307 に答える