スレッドを使用した同期処理
何かの処理が終わるまで処理を待つサンプルです。
ここではjoinを使用することにより、スレッドで実装した2秒間の待ち時間を経てから
次の処理である次の画面を開く処理を実行させています。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
//画面遷移のため
import android.content.Intent;
//ログを出力するため
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WaitThread cls = new WaitThread();
cls.start();
try
{
//他のスレッドを待ちます
cls.join();
}
catch (InterruptedException e)
{
Log.d("InterruptedException",e.getMessage().toString());
}
//次の画面を開きます
nextScreen();
}
//次の画面を開きます
private void nextScreen()
{
Log.d("nextScreen","画面を開く処理を実行します。");
//次の画面に移動します。
Intent intent = new Intent(MainActivity.this,nextScreen.class);
startActivity(intent);
Log.d("nextScreen","次の画面を開く処理を終えました。");
//この画面は閉じます。
MainActivity.this.finish();
}
class WaitThread extends Thread
{
@Override
synchronized public void run()
{
super.run();
//スレッドを開始します
Log.d("run() :","スレッドを開始します");
try
{
//待機状態にします
//wait();
Log.d("WaitThread","2秒間待ちます。");
sleep(2000);
//スレッドが復帰します
Log.d("wait() :","スレッドが復帰します");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
//スレッドを終了します
Log.d("WaitThread :","スレッドを終了します");
}
}
}
|
継承したスレッドのクラスをインスタンス化します。
(例)
WaitThread cls = new WaitThread();
スレッドの内容を実行させます。
(例)
cls.start();
try/catchを使ってjoinでスレッドの実行内容が終わるまで待ちます。
(例)
try
{
//他のスレッドを待ちます
cls.join();
}
catch (InterruptedException e)
{
Log.d("InterruptedException",e.getMessage().toString());
}
処理が終わったら次の画面を開きます。
(例)
//次の画面を開きます
nextScreen();
実行結果
[ログの実行結果例]
10-09 01:30:19.020 10240-10262/com.example.test.test19 D/run() :: スレッドを開始します
10-09 01:30:19.020 10240-10262/com.example.test.test19 D/WaitThread: 2秒間待ちます。
10-09 01:30:21.020 10240-10262/com.example.test.test19 D/wait() :: スレッドが復帰します
10-09 01:30:21.020 10240-10262/com.example.test.test19 D/WaitThread :: スレッドを終了します
10-09 01:30:21.020 10240-10240/com.example.test.test19 D/nextScreen: 画面を開く処理を実行します。
10-09 01:30:21.030 10240-10240/com.example.test.test19 D/nextScreen: 次の画面を開く処理を終えました。
|
|