LoginSignup
7
7

More than 5 years have passed since last update.

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

Posted at

環境

  • 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

非同期処理を学んだ課程

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

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

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);
    }
}

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

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の外に出せることを学ぶ。

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の外に出す方法を学ぶ。

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/

7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7