簡単に使える待ち処理(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();
}
}
});
}
}