簡単に使える待ち処理(Handlerを使った非同期処理)

非同期処理にはいくつかあるのですが、簡単に使えるところとして、HandlerとRunnableを使うサンプルを作りました。

Layoutファイルを使用していないので、たぶんコピペで動作します。

簡単な説明としては、

  • 1秒毎に呼び出される非同期処理部(mRunnable)を定義

    • boolean runningをみていて、これがfalseになるまで1秒毎に自分自身を呼び出す(mHandler.postDelayed)。1度きりの処理では、自分自身を呼び出す必要はありません。

  • ボタンを2つ定義

    • 1つ目:非同期処理を開始する

    • 2つ目:非同期処理を停止する

  • mHandlerにmRunnableを投入(post)

import android.os.Bundle;

import android.os.Handler;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

long time;

boolean running = false;

Handler mHandler;

Runnable mRunnable;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//setContentView(R.layout.activity_main);

LinearLayout ll = new LinearLayout(this);

Button btn0 = new Button(this);

Button btn1 = new Button(this);

btn0.setText("開始");

btn1.setText("終了");

ll.addView(btn0);

ll.addView(btn1);

setContentView(ll);

time = System.currentTimeMillis();

mHandler = new Handler(Looper.getMainLooper());

mRunnable = new Runnable() {

@Override

public void run() {

long now = System.currentTimeMillis();

if(now - time >= 5000){ // over 3sec

Toast.makeText(getApplicationContext(),

"5秒くらい待ちました", Toast.LENGTH_SHORT).show();

time = now;

}

if(running){

mHandler.removeCallbacks(mRunnable);

mHandler.postDelayed(mRunnable, 1000); // after 1sec

}

}

};

btn0.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(!running){

running = true;

mHandler.post(mRunnable);

}

}

});

btn1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(running){

running = false;

Toast.makeText(getApplicationContext(),

"停止しました", Toast.LENGTH_SHORT).show();

}

}

});

}

}