Threadクラス

Javajava.lang

Threadクラスとは?

 状態:-  閲覧数:1,810  投稿日:2014-03-21  更新日:2014-03-21  
・スレッドを扱う基本クラス

スレッドの一般的処理手順
1.java.langパッケージで定義されているRunnableインタフェースを実装
2.Runnableで定義されているrunメソッドを実装し、スレッドとして実行したい処理を記述
3.Runnableインタフェースを実装したオブジェクトを引数にして、Threadクラスをインスタンス化
4.Threadクラスのstartメソッドを呼びだしてスレッドを実行
5.Threadクラスのjoinメソッドを呼びだしてスレッド終了を待機

クラス構成

 閲覧数:349 投稿日:2014-03-21 更新日:2014-03-21 

親クラス



java.lang.Object
   ↳ java.lang.Thread



コード例

 閲覧数:384 投稿日:2014-03-23 更新日:2014-03-23 

例1


スレッドを用いたグラフィック描画処理(円の表示)

Activityクラスを継承したHelloAndroid7Activityクラス
・全体的な処理

HelloAndroid7Activityクラス内で定義している、Viewクラスを継承したDrawViewSampleクラス
・スレッドを用いたグラフィック描画処理(円の表示)
・描画処理をすべてソースコードで記述できるように、ビューをXMLから生成するのではなく、動的に定義して生成

Paintクラス
・図形の描き方に関する設定
・ここでは、円の色、線の幅、線のスタイルなどを指定

座標の設定
・Mathクラスの三角関数を用いて、円弧の座標を求めている

スレッドの内容
・スレッドとして実行している処理は、実質、ix++とpostInvalidateメソッド呼出の2行だけ
・postInvalidateメソッドが、画面の再描画をリクエスト
   ↓
・このメソッドを受けて、Androidでは再描画処理を実施
   ↓
・onDrawメソッドが呼ばれる
   ↓
・onDrawメソッドで描画するたびに、円の座標が進んでいるため、動いているように見える

▼/HelloAndroid7/src/android/style/HelloAndroid7Activity.java
package android.style;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;

import static java.lang.Math.toRadians;
import static java.lang.Math.cos;
import static java.lang.Math.sin;

public class HelloAndroid7Activity extends Activity {

// 独自のビュー
DrawViewSample v;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
v = new DrawViewSample(getApplication());
setContentView(v);
}

@Override
protected void onResume() {
super.onResume();
v.onResume(); // スレッド終了の呼び出し
}

@Override
protected void onPause() {
super.onPause();
v.onPause(); // スレッド生成、開始の呼び出し
}

class DrawViewSample extends View {

int status = 0; // 状態管理変数
int ix = 0;
Thread timer;

// (1)スレッドとして実行したい処理の定義。無名クラスを用いてRunnableインタフェースを実装
Runnable task = new Runnable() {
public void run() {
// statusが0の間実行する
while (status == 0) {
ix++; // 座標更新のためインクリメント(円弧の座標を進めるため)
postInvalidate(); // 画面更新依頼。Viewクラスで定義されたメソッドで、画面の再描画をリクエストする。画面を無効にし、描き直すようにAndroidに伝える
try {
Thread.sleep(100); // 処理の間隔をあけるために、スレッドを100ミリ秒間待機
} catch (InterruptedException e) {
}
}
}
};

public DrawViewSample(Context context) {
super(context);
}

// (2)スレッドの開始
public void onResume() {
timer = new Thread(task);
timer.start();
}

// (3)スレッドの終了。Threadクラスのjoinメソッドを使って、スレッドが終わるまでアプリケーションを待機させている。この例では、joinメソッドでの待機を省いても問題ないが、スレッドが終わる前にアプリケーション本体が終了してしまう、といった事態を防ぐために、通常joinメソッドで待機するようにする
public void onPause() {
status = 1; // スレッドを終了させる
try {
timer.join(); // スレッドが終了するまで待機
} catch (InterruptedException e) {
}
}

@Override
protected void onDraw(Canvas canvas) {// Canvasクラスのオブジェクトが渡される
super.onDraw(canvas);

// 描き方の指定
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStrokeWidth(2);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);

// 座標の設定。Mathクラスの三角関数を用いて、円弧の座標を求めている
double r = toRadians(6 * this.ix);
double x = 100 + 50 * cos(r);
double y = 100 + 50 * sin(r);

// 線で円を描く
canvas.drawCircle((float)x, (float)y, 5, paint);
}
}
}


・xml … レイアウト
▼/HelloAndroid7/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />

</LinearLayout>



コメント投稿(ログインが必要)



類似度ページランキング
順位 ページタイトル抜粋
1 Threadクラス 100
2 Calendarクラス 70
3 CardViewクラス 70
4 Timeクラス 63
5 Dateクラス 63
6 TableRowクラス 60
7 EditTextクラス 60
8 Fragmentクラス 60
9 Toastクラス 59
10 ArrayAdapterクラス 58
11 Bundleクラス 56
12 Gradle 53
13 TableLayoutクラス 52
14 FrameLayoutクラス 52
15 AlertDialogクラス 52
16 SurfaceViewクラス 52
17 LinearLayoutクラス 50
18 Viewクラス 50
19 TextViewクラス 50
20 ViewGroupクラス 48
2024/9/21 20:45 更新