2016-03-31 4 views
1

ループは私のアプリケーションをフリーズしますが、終了後は正常に動作します。 Threadでループを実行しようとしましたが、アプリをフリーズしなくてもうまくいきました。しかし、今問題は、私たちが再起動することができないので、私はアプリのクラッシュを行う場合、私は同じループを再び実行することができないということですThread。私は、アプリケーションをフリーズさせず、再び実行できるようにループを実行したい。どうしたらいいですか?私MainActivityクラスで私のアプリをフリーズせずにループを実行するには?

コード:

protected Thread sendthread; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

sendthread = new Thread(new Runnable() { 

    @Override 
    public void run() { 

    for(int i=0;i<amount;i++){ 

      if (status == 0){ 

       break; 

      } 

      SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumber.getText().toString(),null,messagetoSend, null, null); 

    } 

    } 
}); 


} 

Threadは私が0

+3

新しいスレッドを作成します。各ループごとに。 – Tokazio

+0

は 'ExecutorService'を作成し、そこで重いループを実行します。 –

+0

AsyncTaskを使用できます –

答えて

1

呼び出し方法

private void loopInAnotherThread() { 
    new Thread(new Runnable() { 
     public void run() { 
      // Your loop 
     } 
    }).start(); 
} 
+0

ありがとうございました! <3私は2日以来のことを把握しようとしていました。 –

+1

@ShahbazTalpurユーザがボタンを押すたびに新しいスレッドを作成するのはこの場合にはうまくいくかもしれませんが、一般的にバックグラウンドで実行したいタスクごとに新しいスレッドを作成するのは悪い考えです。スレッドの作成と破棄は高価です。 'AsyncTask'(Balu SKTの提案)やスレッドプール(' ThreadPoolExecutor'など)を使う方がはるかに良いアイデアです。) –

0

statusを設定することで、スレッドを停止button

start.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     status = 1; 
     sendthread.start(); 

} 

によって開始され、内部を制御するブール変数を維持ループと外部無限ループを使用してスレッドの終了を停止します。

2

AsyncTaskを試してみてください。 onPreExecuteのプログレスバーを起動し、にcancelと呼び出してください。 doInBackgroundの内部では、スリープを呼び出すことができます。これによりアプリがクラッシュすることはなく、アプリが応答していないように感じることはありません。

1

runメソッドでループするコードを持つRunnableを作成します。次に、UIスレッドにポストする2番目のRunnableを作成します。その後

Runnable myRunnable = new Runnable() { 
    @Override 
public void run() { 
     while (testByte == 0) { 
      Thread.sleep(1000); // 1 Second delay 
      String updateWords = updateAuto(); // make updateAuto() return a string 
      myTextView.post(new Runnable() { 
       @Override 
       public void run() { 
         myTextView.setText(updateWords); 
       }); 
     } 
} 

あなたはRunnableをを使用してスレッドを作成し、これと同様 それを起動することができます:あなたがループしたい何度でも

Thread myThread = new Thread(myRunnable); 
myThread.start(); 
関連する問題