Androidで非同期処理（AsyncTask）を繰り返す方法を学ぶ

##環境
- Windows 7
- AndroidStudio 3.0

##何がしたいのか？
AsyncTaskの処理が完了した後に再度AsyncTaskを呼び出す処理を無限ループさせたい。

##作成アプリ
githubにあげてみた。これの「Sample_CallBack_Repeat」
https://github.com/sourcekatu/Android_Sample_CallBack

非同期処理のコールバックが呼び出されるたびにカウントが進んでいく。
クリアでカウントを0にする。↓
![Screenshot_2018-06-10-19-34-00.png](https://qiita-image-store.s3.amazonaws.com/0/256346/64c4e547-ded1-da8e-3a4a-18aaaa813bc7.png)

##非同期処理を学んだ課程

サンプルを3つ作成してやり方を学ぶ。
「Sample_CallBack1」でコールバックの方法を学ぶ。
「Sample_CallBack2」でコールバックを受ける場所を変更する方法を学ぶ。
「Sample_CallBack_Repeat」で非同期処理を繰り返す方法を学ぶ。

全サンプル共通の非同期処理の部分。

```java:ASyncTaskTest.java
// AsyncTaskの引数は以下の用途で使用。
// 第一引数：doInBackgroundの引数
// 第二引数：onProgressUpdateの引数
// 第三引数：doInBackgroundの戻り値 and onPostExecuteの引数
public class ASyncTaskTest extends AsyncTask<String, Void, String> {

    private CallBackTask mcallbacktask;

    // バックグラウンドの処理。ここではTextViewの操作はできない。
    @Override
    protected String doInBackground(String... strings) {
        return strings[0];
    }

    // doInBackgroundの処理が終了した後に呼ばれる。ここではTextViewの操作はできる。
    @Override
    protected void onPostExecute(String result) { mcallbacktask.CallBack(result); }

    public void setOnCallBack(CallBackTask t_object)
    {
        mcallbacktask = t_object;
    }

    // コールバック用のインターフェース定義
    interface CallBackTask
    {
        void CallBack(String result);
    }
}
```

まずはコールバックのやり方を学ぶ。

```java:Sample_CallBack1.java
public class MainActivity extends AppCompatActivity {
    TextView tw;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tw = (TextView)findViewById(R.id.textView);

        // 非同期タスク初期化
        ASyncTaskTest ak = new ASyncTaskTest();

        // コールバック設定
        ak.setOnCallBack(new ASyncTaskTest.CallBackTask() {

            @Override
            public void CallBack(String result) {
                tw.setText(result);
            }
        });
        ak.execute("Sample_Callback1");    // 非同期タスクを実行。
    }
}
```

MainActivityのところにimplements ～を記載すると、
コールバックの処理onCreateの外に出せることを学ぶ。

```java:Sample_CallBack2.java
public class MainActivity extends AppCompatActivity implements ASyncTaskTest.CallBackTask{
    TextView tw;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tw = (TextView)findViewById(R.id.textView);

        // 非同期タスク初期化
        ASyncTaskTest ak = new ASyncTaskTest();

        // コールバック設定
        ak.setOnCallBack(this);

        ak.execute("Sample_CallBack2");    // 非同期タスクを実行。
    }

    @Override
    public void CallBack(String result) {
        tw.setText(result);
    }
}
```

最後に非同期処理を繰り返す方法を学ぶ。
ついでにボタンを押下した後の処理もonCreateの外に出す方法を学ぶ。

```java:Sample_CallBack_Repeat.java
public class MainActivity extends AppCompatActivity implements ASyncTaskTest.CallBackTask, View.OnClickListener {
    TextView tw;
    ASyncTaskTest ak = new ASyncTaskTest();
    Button button;
    Integer ii = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tw = (TextView)findViewById(R.id.textView);
        button = (Button)findViewById(R.id.button2);

        // クリアボタンセット。
        button.setOnClickListener(this);

        // コールバック設定
        ak.setOnCallBack(this);
        ak.execute(String.valueOf(ii)); // 非同期タスクを実行。
    }

    // 非同期タスクのコールバックが呼ばれるたびに処理を行う。
    @Override
    public void CallBack(String result) {
        tw.setText(result);

        ii++;

        // 再度非同期タスク設定して実行。
        ak = new ASyncTaskTest();
        ak.setOnCallBack(this);
        ak.execute(String.valueOf(ii));
    }

    @Override
    public void onClick(View v) {
        ii = 0;
        tw.setText(String.valueOf(ii));
    }
}
```

##参考
https://qiita.com/a_nishimura/items/1548e02b96bebd0d43e4
http://www.kisse-logs.com/2017/05/31/java-callback/