2012年8月8日水曜日

Threadの利用方法:Java標準

Threadを利用しない場合



時間の掛かる処理終了後に画面が表示される。

import android.os.Bundle;
import android.app.Activity;
import android.widget.Toast;

public class MainActivity extends Activity {

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

  waitTime();// 時間のかかる処理

  Toast.makeText(this, "時間の掛かる処理終了後に実行されるはず", Toast.LENGTH_LONG).show();

 }

 private void waitTime() {
  // TODO 自動生成されたメソッド・スタブ
  try {
   Thread.sleep(10 * 1000);
  } catch (InterruptedException e) {
   // TODO 自動生成された catch ブロック
   e.printStackTrace();
  }
 }

}

Java標準のThreadを利用した並列処理を使った場合
時間の掛かる処理終了前に画面が表示される

import android.os.Bundle;
import android.app.Activity;
import android.widget.Toast;

public class MainActivity extends Activity {

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

  new Thread(new Runnable() {
   public void run() {
    // TODO Auto-generated method stub
    waitTime();// 時間のかかる処理
   }
  }).start();

  Toast.makeText(this, "時間の掛かる処理終了前に表示されるはず", Toast.LENGTH_LONG).show();

 }

 private void waitTime() {
  // TODO 自動生成されたメソッド・スタブ
  try {
   Thread.sleep(10 * 1000);
  } catch (InterruptedException e) {
   // TODO 自動生成された catch ブロック
   e.printStackTrace();
  }
 }

}

UI操作を行う場合 Handler を使う



時間の掛かる処理からデータを受け取ってUIを操作している。

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

 private TextView textView;

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

  textView = (TextView) findViewById(R.id.textView1);
  
  final Handler handler = new Handler();
  
  new Thread(new Runnable() {
   public void run() {
    // TODO Auto-generated method stub
    
    final int num = waitTime();//時間のかかる処理
    
    handler.post(new Runnable() {
     public void run() {
      //int num = waitTime();// ここに置いたら別スレッドにならない
      textView.setText("UIを変更::" + num);
     }
    });
   }

  }).start();

  Toast.makeText(this, "これが先に実行されるはず", Toast.LENGTH_LONG).show();

 }

 private int waitTime() {
  // TODO 自動生成されたメソッド・スタブ
  try {
   Thread.sleep(10 * 1000);//10秒待つ
   
  } catch (InterruptedException e) {
   // TODO 自動生成された catch ブロック
   e.printStackTrace();
  }
  return 2012;
 }

}


関連記事

0 件のコメント:

コメントを投稿