2012-07-20 11 views
6

アクティビティを再開しようとしたら、AsyncTaskを再起動するときに問題が発生します。Android再起動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の新しいインスタンスを作成する限り、それらのタスクを再開する必要があります。

私は何かすべきことはありますか?

が正しいことを、

+1

あなたはそれを動作させることができないということを意味しますか?エラーメッセージが表示されますか? –

+0

申し訳ありませんテッド、それは言葉の悪い選択でした。私はそれを再開させることができないことを意味しました。エラーコードは何も得られません。それはdoInBackgroundに行きません – jramirez

+0

このコードは 'onCreate'ですか? 'onResume'? @TedHoppに同意すると、より多くの情報が必要になります。 – Greyson

答えて

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. 

これは、これまでに取り組んでいる:ここにコードがあります。ありがとうございました。これが誰かを助けることを願っています

+1

'AsyncTask'の利点は、スレッドプール上でタスクを実行することです。毎回新しいスレッドを作成するよりも効率的です。もちろん、あなた自身のスレッドプールでこれを実行することもできます。 – dhaag23

2

をありがとう、あなたは、単に新しいインスタンスを作成して、再度起動し、それを実行することができます。私はどのような機能をあなたがその仕事を始めているのだろうか? onResume()関数で起動することをお勧めします。これは、フォアグラウンドに戻る前にアクティビティが破棄されない場合に備えてです。

0

は次のようにonResume()にこのコードを入れてみてください:

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

あなたが戻ってあなたActivityに再開するとき、それは新しいオブジェクトを作成する必要があります。あなたはそれを投稿していませんでしたが、たぶん1回だけ実行されるonCreate()のオブジェクトを作成していました。

Socket接続を処理することをお勧めしますが、Threadをサブクラス化するだけです。

+0

注意... @Overrideアノテーションを関数に追加する必要があります。また、明確にするために、アクティビティが作成されるたびにonCreate()が呼び出されます。だからonResumeですが、違いはonCreateが再び呼び出される前にアクティビティが死ぬことです。これは基本的に20分前に投稿したのと同じ回答です... – Joel

+0

非同期タスクが何をしているかによって、これは非常に貧弱な戦略になる可能性があります。 'onResume'は、アクティビティが休止状態から復帰するたびに呼び出されます。これは、アクティビティが生きている間に何度も起こることがあります。 (例えば、通知をプルダウンする、電話をかける、など) –

+0

オーバーライドをうまく捕まえます。 onCreate()はアクティビティが作成されるたびに呼び出されますが、アクティビティを再度アクティブにすることに問題があるようで、onResume()を呼び出すだけです。彼は彼の接続のためだけにスレッドを使うことを勧めました。 –

2

これは将来これを満たす人に役立つかもしれません。

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

ベター、タスクの新しいインスタンスを起動するために、OnPostExecuteを使用するあなただけのメソッドを追加することができます。タスクが完了すると起動します。しかし、自分自身をトリガすることを防ぐために、ブール値を使用して、毎回

protected void onPostExecute(Void result) { 

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

} 
0

デベロッパーのウェブサイトは

最初に導入されたとき、AsyncTasksが単一のバックグラウンドスレッド上で逐次実行されたと言います。DONUTから始めて、これはスレッドのプールに変更され、複数のタスクを並列に動作させることができました。 HONEYCOMBを開始すると、タスクは1つのスレッド上で実行され、並列実行によって発生する一般的なアプリケーションエラーを回避します。

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

AsyncTaskは、HONEYCOMBから始めて、タスクを実行するためにデフォルトで単一のExecutorを使用し、一度に1つのタスクを実行します。これは、すでにアクティビティ(メインスレッドのどこか)でmyTask.execute()を呼び出すと、最初のタスクが完了するまでdoInBackgroundメソッドを呼び出すのを待つことを意味します。 IsSocketConnected()メソッドがすぐに返されない場合、現在のタスクが完了するまで、AsyncTask.execute()メソッドをメインスレッドのどこでも呼び出した後、doInBackground()呼び出しをブロックします。あなたのisSocketConnected()は、このような待機()またはのThread.sleep()などの任意のブロック操作を使用している場合

、あなたがあなたの活動にonDestroyで(真)myTask.cancel()コールバックを呼び出すことによって、それを回避することができ、 InterruptedExceptionがスローされます。スレッドがdoInBackgroundメソッドを終了させる場所でInterruptedExceptionをキャッチするようにしてください。

カスタムThreadPoolExecutorを使用し、AsyncTask.executeOnExecutor(Executor)メソッドを呼び出すことで回避策を行うこともできます。

0

代わりに、次のように使用します。 connectedTask = new myTask(); connectedTask.execute();

単純に使用してください: newconnectTask.execute(); あなたはどこにいても、タスクを再開したいと思っています。

関連する問題