1. 程式人生 > >handler通訊(子執行緒傳資料到主執行緒)

handler通訊(子執行緒傳資料到主執行緒)

1.handler通訊小demo

1>.開子執行緒獲取當前的時間,然後每隔10s將獲取時間儲存到檔案中;

2>.在UI執行緒也是每隔10s從檔案中獲取儲存的時間,然後在TextView中做即時展示和ListView中做所有資料的展示。

package com.zhc.demo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {

	private TextView tvShow;
	private ListView ListViewBattery5;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListViewBattery5 = (ListView) findViewById(R.id.ListViewBattery5);
		tvShow = (TextView) findViewById(R.id.tv_show);
/**
 * 開啟子執行緒,裡面做了耗時操作
 */
		new Thread(new Runnable() {
			@Override
			public void run() {
				// 每秒改變textview的值
				while (true) {
					try {
						Message msg = new Message();//建立信使(很形象的理解)
						msg.what = 1;//給信使做標記
						Bundle bundle = new Bundle();//建立放資料的容器
						
						// 獲取當前時間
						SimpleDateFormat formatter = new SimpleDateFormat(
								"yyyy年MM月dd日 HH:mm:ss ");
						Date curDate = new Date(System.currentTimeMillis());
						String date = formatter.format(curDate);

						bundle.putString("num", date);//容器裡面放入資料,鍵值對的形式放入。放入的值為String型別則用putString,為int型別則用putInt。
						
						// 儲存資料到檔案
						String inputText = date + "\r\n";
						save(inputText);

						msg.setData(bundle);//將存放了資料的容器交給信使
						handler.sendMessage(msg);	// handler傳遞引數

						Thread.sleep(10 * 1000); // 睡眠10s
					} catch (Exception e) {
						e.printStackTrace();
						System.out.println("thread error...");
					}
				}
			}

			/**
			 * 儲存資料到檔案中
			 * 
			 * @param inputText
			 */
			public void save(String inputText) {
				FileOutputStream out = null;
				BufferedWriter writer = null;
				try {
					out = openFileOutput("data", Context.MODE_APPEND);
					writer = new BufferedWriter(new OutputStreamWriter(out));
					writer.write(inputText);
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					try {
						if (writer != null) {
							writer.close();
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();//.start()方法切記不能漏
	}

	/**
	 * handler類接收資料
	 */
	Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			if (msg.what == 1) {
				// 動態更新資料UI介面
				String str = msg.getData().getString("num") + "";//獲取值時相應的型別要對應,傳入為String型別用getString;Int型別用getInt。
				tvShow.setText(str);//將資料展示到TextView

				// 讀取檔案中的資料
				String inputText1 = load();
				if (!TextUtils.isEmpty(inputText1)) {// 非空判斷,傳入為null和空字串時返回true
					// 將資料展示到listview控制元件
					ArrayAdapter<String> adapter = new ArrayAdapter<String>(
							MainActivity.this,
							android.R.layout.simple_list_item_1);// android.R.layout.simple_list_item_1android內建子佈局
					adapter.add(inputText1);
					ListViewBattery5.setAdapter(adapter);
				}
			}
		};

		/**
		 * 從檔案裡面讀取資料
		 * 
		 * @return
		 */
		public String load() {
			FileInputStream in = null;
			BufferedReader reader = null;
			StringBuilder content = new StringBuilder();
			try {
				in = openFileInput("data");
				reader = new BufferedReader(new InputStreamReader(in));
				String line = "";
				while ((line = reader.readLine()) != null) {
					line = line + "\n";
					content.append(line);
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (reader != null) {
					try {
						reader.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
			return content.toString();
		};
	};
}