Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)

メインスレッドが生成する二つのサブスレッドに於いて
SubThread1はSubThread2からの情報を受取り内部データを更新する。
SubThread2は何らかの情報を指定されたThreadに引き渡す役目を持つ。

SubThread1はインスタンスが生成され実行されるとLooperがループし、 メーセージを待つ。
また、SubThread1は自身のThreadで実行されるHandlerを生成し要求元へ引き渡す機能をもつ。
生成されたHandlerは他のThreadから送られてきたMessageの内容に従って特定の処理を実行するhandleMessage()を持つ。
このHandlerを生成する関数を複数種用意する事により、異なった機能を持たせる事ができる。

SubThread2はSubThread1が生成したHandlerを受け取り、自身が生成したデータをMessageに載せ、HandlerをsendMessage()でSubThread1に送る。
SubThread2は送ったハンドルを誰(Thread)が受け取りどの様に処理されるかは知らない。

メインスレッドはデータを処理する者(SubThread1)とデータを提供する者(SubThread2)の関係を制御するスレッドとなる。

※下記sampleはスレッドの実行順序の不正によるエラーは考慮していない。

■MainActivity

package jp.no4393.loopertest002;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

private SubThread1 subThread1;

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

public void bt1onClick(View view){
Log.d("LT002","B1-----start.");
subThread1 = new SubThread1();
subThread1.start();
Log.d("LT002","B1-----end.");
}

public void bt2onClick(View view){
Log.d("LT002","B2-----start.");
SubThread2 st2 = new SubThread2(subThread1.getHandler());
st2.start();
Log.d("LT002","B2-----end.");
}
}





■subThread1

package jp.no4393.loopertest002;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class SubThread1 extends Thread{

private String mark;
private Looper myLooper;

SubThread1(){
}

public void run(){
Log.d("LT002","T1 run.");
Looper.prepare();
myLooper = Looper.myLooper();
Looper.loop();
Log.d("LT002","T1 run end.");
}

public Handler getHandler(){
Log.d("LT002","T1 getHandler.");
mark = "SubThead1 getHandler.";
return new Handler(myLooper) {
public void handleMessage(Message msg) {
mark = String.valueOf(msg.what) + " mark=" + (String) msg.obj;
Log.d("LT002", mark);
}
};
}

}




■SubThread2

package jp.no4393.loopertest002;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class SubThread2 extends Thread {

private Handler toHandler;

SubThread2(Handler toHandler){
this.toHandler = toHandler;
}

public void run(){
Log.d("LT002","ST2 run sendMessage.");
try{
Thread.sleep(2000);
}catch(InterruptedException e){}
Message msg = new Message();
msg.what = 123;
msg.obj = "ST2 run message obj. myThreadId=" + String.valueOf(Thread.currentThread().getId());
toHandler.sendMessage(msg);
Log.d("LT002","ST2 run end.");
}

}




■log

Button1をタッチ後、Button2を三回連続タッチした時のlog

10-30 09:07:02.110 4768-4768/jp.no4393.loopertest002 D/LT002: B1-----start.
10-30 09:07:02.110 4768-4768/jp.no4393.loopertest002 D/LT002: B1-----end.
10-30 09:07:02.110 4768-5001/jp.no4393.loopertest002 D/LT002: T1 run.
10-30 09:07:03.241 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----start.
10-30 09:07:03.241 4768-4768/jp.no4393.loopertest002 D/LT002: T1 getHandler.
10-30 09:07:03.241 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----end.
10-30 09:07:03.241 4768-5075/jp.no4393.loopertest002 D/LT002: ST2 run sendMessage.
10-30 09:07:03.812 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----start.
10-30 09:07:03.812 4768-4768/jp.no4393.loopertest002 D/LT002: T1 getHandler.
10-30 09:07:03.822 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----end.
10-30 09:07:03.822 4768-5107/jp.no4393.loopertest002 D/LT002: ST2 run sendMessage.
10-30 09:07:04.383 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----start.
10-30 09:07:04.383 4768-4768/jp.no4393.loopertest002 D/LT002: T1 getHandler.
10-30 09:07:04.383 4768-4768/jp.no4393.loopertest002 D/LT002: B2-----end.
10-30 09:07:04.383 4768-5146/jp.no4393.loopertest002 D/LT002: ST2 run sendMessage.
10-30 09:07:05.244 4768-5075/jp.no4393.loopertest002 D/LT002: ST2 run end.
10-30 09:07:05.244 4768-5001/jp.no4393.loopertest002 D/LT002: 123 mark=ST2 run message obj. myThreadId=519
10-30 09:07:05.834 4768-5107/jp.no4393.loopertest002 D/LT002: ST2 run end.
10-30 09:07:05.834 4768-5001/jp.no4393.loopertest002 D/LT002: 123 mark=ST2 run message obj. myThreadId=520
10-30 09:07:06.385 4768-5146/jp.no4393.loopertest002 D/LT002: ST2 run end.
10-30 09:07:06.385 4768-5001/jp.no4393.loopertest002 D/LT002: 123 mark=ST2 run message obj. myThreadId=521





■環境
Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)


Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)


Thread間通信 Handler Message Looper(android studio)(Android)(備忘録)

スポンサーサイト

System.out.print()の出力先(android studio)(Android)(備忘録)

USB接続でNEC N-03E(Android 4.1.2 API 16)に接続してテスト。
Android Studio 2.2.1


■テスト目的
System.out.print()の出力先について。

■結果
Android Monitorのlogcatに表示される。


■MainActivity

package jp.no4393.printtest001;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

public void buttonOnClick(View view){
System.out.println("println 001.");
System.out.println("println 002.");
System.out.print("print 101.");
System.out.print("print 102.");
System.out.println("println 201.");
}

}





■出力結果(logcat)

10-16 11:12:43.324 17265-17265/jp.no4393.printtest001 I/System.out: println 001.
10-16 11:12:43.324 17265-17265/jp.no4393.printtest001 I/System.out: println 002.
10-16 11:12:43.324 17265-17265/jp.no4393.printtest001 I/System.out: print 101.print 102.println 201.

スレッドでTextViewの更新(post)(android studio)(Android)(備忘録)

TextViewはUIスレッド(メインスレッド)でないと更新できない。

サブスレッドでTextViewを更新する一例。
ポイント : textView1.post(new Runnable(){});


■MainActivity

package jp.no4393.processthreadtest001;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.logging.Logger;

public class MainActivity extends AppCompatActivity {

private Logger logger;
private TextView textView1;

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

logger = Logger.getLogger("PTTest001");
logger.info("onCreate 001.");

textView1 = (TextView)findViewById(R.id.textView1);
}

public void buttoun1onClick(View view){
logger.info("buttoun1onClick 001.");
((Button)view).setText("buttoun1onClick");

SubThread subThread = new SubThread(logger);
subThread.textView1 = textView1;
Thread thread = new Thread(subThread);
thread.start();

}

}




■subThead

package jp.no4393.processthreadtest001;

import android.widget.TextView;
import java.util.logging.Logger;


public class SubThread implements Runnable {
private Logger logger;
public TextView textView1;

public SubThread(Logger logger){
this.logger = logger;
}

public void run(){
logger.info("subThead.run 001.");
textView1.post(new Runnable(){
public void run() {
textView1.setText("Runnable setText.");
logger.info("Runnable 101.");
}
});
logger.info("subThead.run 002.");
}

}




■log

10-16 18:13:30.182 24965-24965/jp.no4393.processthreadtest001 I/PTTest001: onCreate 001.
10-16 18:13:32.875 24965-24965/jp.no4393.processthreadtest001 I/PTTest001: buttoun1onClick 001.
10-16 18:13:32.875 24965-25170/jp.no4393.processthreadtest001 I/PTTest001: subThead.run 001.
10-16 18:13:32.875 24965-25170/jp.no4393.processthreadtest001 I/PTTest001: subThead.run 002.
10-16 18:13:32.885 24965-24965/jp.no4393.processthreadtest001 I/PTTest001: Runnable 101.

android.os.AsyncTaskの実行スレッド(android studio)(Android)(備忘録)

UDPを使用する事があり、AsyncTask の onPostExecute を実行するスレッドについて確認してみました。

class WhoIsTask extends AsyncTask で AcyncTask のサブクラスを定義して各箇所で LOG を出力し、
実行しているスレッドIDを調べました。


■結果
doInBackground は WhoIsTask のインスタンスを実行しているスレッドで実行される。
onPostExecute は whoIsTask.executeOnExecutor した MainActivity のスレッドで実行される。


10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onCreate 001. Thread ID=1
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onCreate 001. Process myPid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onCreate 001. Process myTid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onStart 001. Thread ID=1
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onStart 001. Process myPid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onStart 001. Process myTid=9124
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: WhoIsTask 001. Thread ID=1
10-16 12:52:19.541 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: WhoIsTask 001. Process myPid=9124
10-16 12:52:19.551 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: WhoIsTask 001. Process myTid=9124
10-16 12:52:19.551 9124-9178/jp.no4393.amefurictrl I/Amefurictrl001: doInBackground 001. Thread ID=1088
10-16 12:52:19.551 9124-9178/jp.no4393.amefurictrl I/Amefurictrl001: doInBackground 001. Process myPid=9124
10-16 12:52:19.551 9124-9178/jp.no4393.amefurictrl I/Amefurictrl001: doInBackground 001. Process myTid=9178
10-16 12:52:19.691 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onPostExecute 001. Thread ID=1
10-16 12:52:19.691 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onPostExecute 001. Process myPid=9124
10-16 12:52:19.691 9124-9124/jp.no4393.amefurictrl I/Amefurictrl001: onPostExecute 001. Process myTid=9124




■ソース概要

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

logger = Logger.getLogger("Amefurictrl001");
logger.info("onCreate 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("onCreate 001. Process myPid=" + android.os.Process.myPid());
logger.info("onCreate 001. Process myTid=" + android.os.Process.myTid());


@Override
protected void onStart() {
super.onStart();

logger.info("onStart 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("onStart 001. Process myPid=" + android.os.Process.myPid());
logger.info("onStart 001. Process myTid=" + android.os.Process.myTid());

whoIsTask = new WhoIsTask(logger);
whoIsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);




public class WhoIsTask extends AsyncTask {

public WhoIsTask(Logger logger){
super();
this.logger = logger;

logger.info("WhoIsTask 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("WhoIsTask 001. Process myPid=" + android.os.Process.myPid());
logger.info("WhoIsTask 001. Process myTid=" + android.os.Process.myTid());


@Override
protected Integer doInBackground(Integer... value){
logger.info("doInBackground 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("doInBackground 001. Process myPid=" + android.os.Process.myPid());
logger.info("doInBackground 001. Process myTid=" + android.os.Process.myTid());


@Override
protected void onPostExecute(Integer result) {
logger.info("onPostExecute 001. Thread ID=" + Thread.currentThread().getId() );
logger.info("onPostExecute 001. Process myPid=" + android.os.Process.myPid());
logger.info("onPostExecute 001. Process myTid=" + android.os.Process.myTid());


お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
キーワード
クリックしたキーワードの記事のみ表示します。

電池 試み IXY デザイン  改造 3D ミッキー 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
ART (1)
橋 (0)
PIC (2)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用