主线程、子线程(多线程)、Handler消息机制之间的关系

1.class BSTApplication extends Application 
  在BSTApplication类中写自己想要的方法
2.public class WorkerThread implements Runnable {

	private final Object mLock = new Object();
	private Looper mLooper;
	private BSTApplication app;
	private Thread thread;

	public WorkerThread(BSTApplication app) {
		this.init(app, "deault workerThread");
	}
	public WorkerThread(BSTApplication app, String name) {
		this.init(app, name);
	}

	public void init(BSTApplication app, String name) {
		thread = new Thread(null, this,name);
		this.setApp(app);
		thread.setPriority(Thread.MIN_PRIORITY);
		thread.start();
		
		synchronized (mLock){
			while(mLooper == null){
				try{
					mLock.wait();
				} catch (InterruptedException ex) {}
			}
		}
	}

	@Override
	public void run() {
		synchronized(mLock){//同步
			Looper.prepare();//线程初始化消息队列。
			mLooper = Looper.myLooper();
			mLock.notifyAll();
			
		}
		Looper.loop();//让线程的消息队列开始运行,可以接收消息了
	}
	
	public Looper getLooper(){
		return mLooper;
	}
	
	public void quit(){
		mLooper.quit();//退出消息循环
	}

	/**得到app*/
	public BSTApplication getApp() {
		return app;
	}

	public void setApp(BSTApplication app) {
		this.app = app;
	}
}
在Activity类中主线程、多线程、handler线程机制

public class AaActivity extends Activity {

	private TextView ShowContent;
	private Button sendbtn;
	BSTApplication app;

	ResultHandler resultHandler;
	ActivityHandler handler;
	WorkerThread work;

	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        app = (BSTApplication) AaActivity.this.getApplicationContext();
        
        ShowContent = (TextView)findViewById(R.id.showcontent);
        sendbtn = (Button)findViewById(R.id.send);
        sendbtn.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				resultHandler = new ResultHandler();
				
				work = new WorkerThread(app,"Loading data");
				handler = new ActivityHandler(work.getLooper(), AaActivity.this);
				Message msg = handler.obtainMessage();
				msg.obj = "Loading:"+"\n";
				handler.sendMessage(msg);
			}
		});
    }

	/** 子线程中的Handler */
	private class ActivityHandler extends Handler {

		public ActivityHandler(Looper looper, Context context) {
			super(looper);
		}

		//主意:ResultHandler不能在这个handler中声明对象
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			Message resMsg = resultHandler.obtainMessage();
			// 和服务器进行交互,得到数据,json解析
			String str = msg.obj.toString() + "  ActivityHandler id = "
					+ Thread.currentThread().getId()+"\n";
			resMsg.obj = str;
			resultHandler.sendMessage(resMsg);
			work.quit();
		}
	}

	/** 与主线程交互的Handler消息机制
	 *  1.接收子线程中的数据 2.和ui主线程交互,刷新界面
	 */
	public class ResultHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			String StrContent = msg.obj.toString();
			StrContent = StrContent + "  ResultHandler id = "
					+ Thread.currentThread().getId()+"\n";
			ShowContent.setText(ShowContent.getText()+StrContent);
		}
	}
}
显示数据:Loading:ActivityHandler id = 8      ResultHandler id = 1
                   ActivityHandler id = 9      ResultHandler id = 1
                   ActivityHandler id = 10     ResultHandler id = 1

http://software.intel.com/zh-cn/blogs/2013/05/08/android-handler/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20intelandroid%20%E2%80%93%20Handler
相关知识

 

posted on 2013-05-21 16:10  菜鸟-青  阅读(383)  评论(0)    收藏  举报