handler通訊(子執行緒傳資料到主執行緒)
阿新 • • 發佈:2019-02-10
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(); }; }; }