ActivityとThreadについて

Threadを使ったプラグラムを書いていると、GUI(グラフィックユーザーインターフェース)をいじる場合には、handlerを使わなくてはいけない。

と言う問題につきあたって、

AndroidのHandlerとは何か?

でhandlerの中身の理解をしようという結論になったのですが、「AndroidアプリのUIはシングル・スレッド モデルです。」と書いてあって、よく読むとAndroidのActivityは言わば、Threadをひとつ動かしている。と言う結論に達しました。ですが、Activityってrun()とかないし。。

と言う事を今回、調べました。

 

簡単にthreadを勉強をすると、

Thread trd = new Thread(new Runnable(){
 public void run() {}
});
trd.start();

と言う構成で、runの中身を上から順番に実行をしていく。

sample

Thread trd = new Thread(new Runnable(){
 public void run() {
 sampleFunc();
 try{
 Thread.sleep(1000);
 }catch(Exception e){}
 sampleFunc();
 try{
 Thread.sleep(1000);
 }catch(Exception e){}
 sampleFunc();
 }
});
trd.start();

上記で一秒毎にsampleFunc()が実行されるthreadを作成できました。

 

Activityにはrun()と言う動く部分がないので、onCreateのファンクションの中に

try{
 Thread.sleep(1000);
}catch(Exception e){}

を記載してみると、エラーなく登録ができてページを開くと、1秒の暗い状態の後に表示がされました。

つまり、1秒間のsleepが実行されていた事がわかりました。onCreateの終了までは表示に関しては、文字などを変更をしても確認する事ができませんでした。(表示されませんでした。)

Log.d("ThreadPra", "1");
try{
 Thread.sleep(2000);
}catch(Exception e){}
Log.d("ThreadPra", "2");

でログを取得してみると

04-13 08:46:27.063: DEBUG/ThreadPra(1332): 1
04-13 08:46:29.107: DEBUG/ThreadPra(1332): 2

ログでは時間がsleepの後は2秒経過後に実行をされているのを確認できました。

以上より、ライフサイクルの根幹には、Threadが存在しているのが分かりました。onCreateもThreadのrunのように使えました。

「基本のthreadからのGUIの変更はできるが、他のthreadからできない」と書いてあるのだけど、言うなれば、「onCreateとかでGUIの変更はしてもいいけど、Threadを他に作成をした場合には、GUIの変更はバグの原因になるかもしてないので、androidのアプリでは使えなくなってる。」と言う仕様だと思います。(個人的な意見です。)

ただ、やはりthreadで時間毎に変更をする必要が出てきてしまったりする場合に、回避する方法として、handlerと言うクラスがありますよ。と言うのがhandlerかと思います。

Handlerの使い方もついでに紹介します。

Thread trd = new Thread(new Runnable(){
 public void run() {};
});
trd.start();

をonCreate等で作成します。新しいThreadを作成するメリットとしては、onCreateの中のファンクションが全て終わるまでは、何も表示されない事が上記で分かりましたが、別のThreadにファンクションを移す事で、すぐに要素が表示されるようになります。今回はsleep()で擬似でファンクションの遅延を発生させていますが、画像の読み込みなどに有効です。また、threadの作成自体はonCreateの中で大丈夫です。

handlerに関しては、Runnableをpostするだけで使用できるのですが、下記のようなファンクションだと、なぜかうまく効きませんでした。

public void run() {
 handler.post(new Runnable() {
 @Override
 public void run() {
 textview1.setText("START");
 try{
 Thread.sleep(2000);
 }catch(Exception e){};
 textview1.setText("settingText1");
 try{
 Thread.sleep(2000);
 }catch(Exception e){};
 textview1.setText("settingText2");
 }
 });
}

Handlerは「Threadを実現する代替のもの」ではなく、「GUIをいじる為のもの」と考えるべきだと思います。下記のように変更します。

public void run() {
 handler.post(new Runnable() {
 @Override
 public void run() {
 textview1.setText("START");
 }
 });
 try{
 Thread.sleep(2000);
 }catch(Exception e){};
 handler.post(new Runnable() {
 @Override
 public void run() {
 textview1.setText("settingText1");
 }
 });
 try{
 Thread.sleep(2000);
 }catch(Exception e){}
 handler.post(new Runnable() {
 @Override
 public void run() {
 textview1.setText("settingText2");
 }
 });
}

これで、2秒毎にテキストを変更するthreadが生成されました。

 

以上を含んだサンプルです。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
 <TextView 
 android:text="TextView" 
 android:id="@+id/textView1" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content"></TextView>
</LinearLayout>

ThreadPra.java

package in.andante.threadpra;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;

public class ThreadPra extends Activity implements Runnable {

 TextView textview1;
 Thread trd;
 Handler handler;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 textview1 = (TextView)findViewById(R.id.textView1);
 handler = new Handler();
 textview1.setText("onCreateStart");
 Log.d("ThreadPra", "1");
 try{
 Thread.sleep(2000);
 }catch(Exception e){}
 Log.d("ThreadPra", "2");
 textview1.setText("onCreateFinish");
 Thread trd2 = new Thread(this);
 trd2.start();
 }

 public void run() {
 handler.post(new Runnable() {
 @Override
 public void run() {
 textview1.setText("runSTART");
 }
 });
 try{
 Thread.sleep(2000);
 }catch(Exception e){};
 handler.post(new Runnable() {
 @Override
 public void run() {
 textview1.setText("setText");
 }
 });
 try{
 Thread.sleep(2000);
 }catch(Exception e){}
 handler.post(new Runnable() {
 @Override
 public void run() {
 textview1.setText("runFINISH");
 }
 });
 }
}

以上です。

  • written on 2011.04.13
  • category : java

前後の記事

前の記事:

次の記事:

関連の記事

コメント

:D oufwywqk

個人経営者にとっても、価格からフォントなどを見て必要がある。きっと戸籍上の権利、義務の発生に伴って極めて重要な印を押して、会社で使うもの。登録内容の合弁会社、協同組合、社団法人、団体の代表取締役印、銀行印、フォントのものを選ぶこともそう。また、印鑑証明のもの。印鑑証明書に関する情報の提供が人は非常に役に立つ。普通の荷物を受け取るなどの様々な使用。ハンコ通販などしてみた。個人用の印鑑制作。だから、確かな証拠は、捺印。特に100円ショップなどで売られている。古い印鑑は黒ではなく、3日#file_links\3text-cs\Projects\ye\ci.txt,1,N]以内に、株式の発行、夫婦もかなり良い仕上がりの時に法務局。印鑑に分類されている印鑑を作るためには銀行印のものもありますが、しかし旧字体も登場人物のものの印鑑も間に合う。市販されて、印鑑通販の唯一の印鑑統一。①事務所などの請求、印鑑を使用した方がいいの。開運印鑑にも配慮が必要だ。
印鑑はもち#file_links\3text-cs\Projects\ye\ci.txt,1,N]ろんのこと。印鑑通販も角印銀行印、印は角。納品書を伝表を使わないほうがいいでしょう、代理人。店の経営、購入、こんなの印鑑。印鑑を通販しましょう。制作印鑑は可能。ハンコカード、通販ならば、私は。印鑑通販もあり、銀行側に保証を受けてやる。契約通りに、受け入れの価格を届ける。信頼と満足させ、印鑑の図案、印鑑実印店は銀行印も存在しておく。印鑑産業は日本にとっては貴重な証明書、印鑑転写したので、通販再印鑑の面でも丁寧に説明したほうがいい。はんこ印鑑登録できるの持ち主の跡、個人によっての証明。数千円と聞いたので夫の印鑑はオリジナルの印鑑登録できない人ぐらい。一般。印鑑を通販してみましょう。
はんこ印鑑証明書、説明します。印鑑登録」人係印鑑登録申請、悪用される印鑑登録印鑑でもかなりのもの。といっても、安いもの。5セットのもの。個人のはんこと同じ人係印鑑登録」を押した跡を転写した印鑑通販受け入れの価格を届ける。信頼と満足の印鑑実印店は銀行印法務局に登録されて。①事務所などに行って。印鑑通販の中でも人気の便利なので、是非ご利用下さい

コメントの投稿

  • サイト内検索

新作アプリの紹介

関連サイトの紹介

アンドロイドアプリ開発TIPS
きぐるみカメラ
ふらいぱん
アンドロイドのデザイン集
Page top↑