Android下多線程同UI互動的Handler架構代碼

來源:互聯網
上載者:User

1 說明
Android開發過程中,使用多線程是一個很平常的事情,而多執行緒完成後,必然需要更新UI,本文略加整理,並附上架構代碼,希望對大家有用。

2 內容
代碼主要結構:
Activity代碼檔案
ProcessThread代碼檔案

其中Activity代碼中建立了Handler msgHandler對象,並重載了handleMessage方法。
ProcessThread中的建構函式,需要傳入msgHandler對象作為構造參數,在處理資料後,發送訊息即可。在主Activity中的handleMessage就會收到訊息。

3 項目代碼

主Activity代碼:

package com.jouhu.androidthreaduihandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class AndroidThreadUIHandlerActivity extends Activity {
public static final int RECV_DATA = 1;

Button btn = null;
ProcessThread pThread = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
pThread = new ProcessThread(msgHandler);
}
});

}

private final Handler msgHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch(msg.what)
{

case RECV_DATA:
if(pThread != null)
{
byte[] data = pThread.getOneBuffer();
UpdateUI(data);
}
break;

}
}

private void UpdateUI(byte[] data) {
// TODO Auto-generated method stub

}
};
}

線程代碼模型:

package com.jouhu.androidthreaduihandler;

import java.util.ArrayList;

import android.os.Handler;
import android.os.Message;

public class ProcessThread extends Thread {

private static final int BUFF_SIZE = 1024;
private Handler handler;
private ArrayList bytesList = null;
boolean running = true;

public ProcessThread(Handler handler)
{
this.handler = handler;
bytesList = new ArrayList();
}

public void run()
{
while(running)
{
//
byte[] buff = new byte[BUFF_SIZE];
Recv(buff,BUFF_SIZE);
Message msg = handler.obtainMessage(AndroidThreadUIHandlerActivity.RECV_DATA);
msg.obj = "Recv";
msg.sendToTarget();
}
}

private void Recv(byte[] buff, int buffSize) {
// TODO Auto-generated method stub
//可以處理Socket接收資料
}

public void AddOneBuffer(byte[]data)
{
//線程同步
synchronized(bytesList)
{
bytesList.add(data);
}
}

public byte[] getOneBuffer()
{
//線程同步
byte[] rdata = null;
synchronized(bytesList)
{
if(bytesList.size() > 0)
rdata = bytesList.remove(0);
}
return rdata;
}

}

4 原始碼下載

模型代碼下載:
AndroidThreadUIHandler
-END-

本文同發地址:http://doandroid.info/2012/03/15/android%E4%B8%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%90%8Cui%E4%BA%A4%E4%BA%92%E7%9A%84handler%E6%A1%86%E6%9E%B6%E4%BB%A3%E7%A0%81/

歡迎轉載,註明出處。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.