2016-09-12 12 views
0

これで、スタートボタンを押した後に1秒に1回カウンターを増加させるAndroidアプリしかありません。これはAsyncTaskで行われ、Thread.sleep(1000);を呼び出して1秒に1回インクリメントします。停止ボタンを押すとタスクはキャンセルされますが、スタートボタンをもう一度押すと、ボタンのテキストが「停止」に変わりますが、カウンタが開始していないように見えます(TextViewは更新されず、System.out.printlnのカウンターは表示されません)。AsyncTaskの新しいインスタンスでカウンタが再起動しない

停止ボタンが押下されると、タスクがキャンセルされ、新しいインスタンスが変数に割り当てられているが:

package com.lukechenshui.timelapse; 

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 


public class MainActivity extends AppCompatActivity { 
    CounterTask task = new CounterTask(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    } 

    public void toggleTimer(View view){ 
    Button button = (Button)findViewById(R.id.timerButton); 
    if(task.getStatus() == AsyncTask.Status.RUNNING){ 
     task.cancel(false); 
     task = new CounterTask(); 
     button.setText("Start"); 
    } 
    else{ 
     Integer temp = 0; 
     task.execute(temp); 
     button.setText("Stop"); 
    } 
    System.out.println(task.getStatus()); 
    } 

    private class CounterTask extends AsyncTask { 
    @Override 
    protected Object doInBackground(Object[] params) { 
     for(int counter = 0; true; counter++){ 
      try{ 
       publishProgress(counter); 
       Thread.sleep(1000); 

      } 
      catch(InterruptedException exc){ 
       exc.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    protected void onProgressUpdate(Object[] values) { 
     TextView counterView = (TextView)findViewById(R.id.counterTextView); 
     counterView.setText(String.valueOf(values[0])); 
     System.out.println(values[0]); 
    } 
    } 

} 

レイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.lukechenshui.timelapse.MainActivity" 
    android:orientation="vertical"> 

    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Start" 
    android:id="@+id/timerButton" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:clickable="true" 
    android:onClick="toggleTimer" 
    android:layout_gravity="center_horizontal" /> 

    <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/counterTextView" 
    android:layout_gravity="center_horizontal" /> 

</LinearLayout> 

出力例:

//Pressed start 
I/System.out: Starting counter! 
I/System.out: RUNNING 
I/System.out: 0 
I/System.out: 1 
I/System.out: 2 
I/System.out: 3 
I/System.out: 4 
I/System.out: 5 
I/System.out: 6 
//Pressed stop 
I/System.out: Stopping counter! 
I/System.out: PENDING 
//Pressed start 
I/System.out: Starting counter! 
I/System.out: RUNNING 
//Pressed stop 
I/System.out: Stopping counter! 
I/System.out: PENDING 

これを修正できる方法はありますか?

+1

'実行 'に渡される' temp'変数の目的は何ですか? –

+0

@ cricket_007それは目的を果たしません。私は誓っていた可能性がありますが、パラメータが必要であることについて以前はエラーが出ましたが、私はそれをテストしました。 – Sky

+1

@ cricket_007 forループの 'true'を'!isCancelled() 'に置き換えました。 – Sky

答えて

1

私は、AsyncTaskは無限ループを持ち、キャンセルされていないと考えています。

true!isCanceled()に置き換えることができます。キャンセルすると、AsyncTaskが終了するはずです。

停止時にタスクをnullに設定することもできます。

関連する問題