android開發handler與線程的用法

在android的開發中,如果用Handler來啓動Runable函數的run,這都知在主線程中運行,而不是新開一個線程單獨運行,這樣如果run中運行沒有結果就會影響主線程中的Activity,導致應用無響應。所以android就有一個類“HandlerThread”,通過它來新建一個子線程與主線程分開,再把這樣子線程綁定在新建的Handler對象上,這樣run函數就會在子線程中運行,而不影響Activity。

 

        下面例子是線程來控制一個水平進度條的例子:

 

package com.example.taxtbarhandler01;

import android.opengl.Visibility;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class Taxtnarhandler01 extends Activity {

	private Button start;
	private Button end;
	//進度條
	private ProgressBar bar;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		start = (Button)findViewById(R.id.start);
		end = (Button)findViewById(R.id.end);
		bar = (ProgressBar)findViewById(R.id.progressBar1);
		bar.setMax(100);
		//輸出當前線程的名字與ID;
		System.out.println("Activity-->" + Thread.currentThread().getId());
		System.out.println("Activity-->" + Thread.currentThread().getName());
		//start監聽器
		start.setOnClickListener(new Startlistener());
		end.setOnClickListener(new Endlistener());
	}

	Myhandler handler ;
	class Startlistener implements OnClickListener{

		@Override
		public void onClick(View arg0) {
			// TODO Auto-generated method stub
			//輸出當前線程的名字與ID;
			System.out.println("start-->" + Thread.currentThread().getId());
			System.out.println("start-->" + Thread.currentThread().getName());
			bar.setVisibility(View.VISIBLE);
			//創建一個子線程;
			HandlerThread updata = new HandlerThread("name");
			updata.start();
			//把子線程綁定在handler中
			handler = new Myhandler(updata.getLooper());
			handler.post(r);
		}
		
	}
	
	class Endlistener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			//輸出當前線程的名字與ID;
			System.out.println("end-->" + Thread.currentThread().getId());
			System.out.println("end-->" + Thread.currentThread().getName());
			bar.setVisibility(View.GONE);
		}
		
	}
	
	
	//匿名內部類
	class Myhandler extends Handler{
		public Myhandler(){
			
		}
		public Myhandler(Looper looper){
			super(looper);
		}
		@Override
		//從消息隊列中取出消息處理
		public void handleMessage(Message msg) {
			//輸出當前線程的名字與ID;
			System.out.println("handler-->" + Thread.currentThread().getId());
			System.out.println("handler-->" + Thread.currentThread().getName());
			// TODO Auto-generated method stub
			//更新進度條
			bar.setProgress(msg.arg1);
			//進入運行隊列
			handler.post(r);
			if (msg.arg1 == 100)
			{
				handler.removeCallbacks(r);
				//注意,因爲進度條bar是在主線程中建立的,而這個函數是在子線程中運行,所以不能在這裏改變bar的狀態,否則會報錯(這是我個人理解,因爲報錯了-_-!)
		//		bar.setVisibility(View.GONE);
			}
		}
		
	}
	
	Runnable r = new Runnable() {
		int i = 0;
		@Override
		public void run() {
			//輸出當前線程的名字與ID;
			System.out.println("run-->" + Thread.currentThread().getId());
			System.out.println("run-->" + Thread.currentThread().getName());
			// TODO Auto-generated method stub
			System.out.println("++" + i);
			i = i + 10;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//傳送消息
			Message msg = handler.obtainMessage();
			msg.arg1 = i;
			//消息入隊列
			msg.sendToTarget();
		}
	};
	
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章