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
これを修正できる方法はありますか?
'実行 'に渡される' temp'変数の目的は何ですか? –
@ cricket_007それは目的を果たしません。私は誓っていた可能性がありますが、パラメータが必要であることについて以前はエラーが出ましたが、私はそれをテストしました。 – Sky
@ cricket_007 forループの 'true'を'!isCancelled() 'に置き換えました。 – Sky