handler通信(子线程传数据到主线程)
2016-07-09 18:06
239 查看
1.handler通信小demo
1>.开子线程获取当前的时间,然后每隔10s将获取时间保存到文件中;
2>.在UI线程也是每隔10s从文件中获取保存的时间,然后在TextView中做即时展示和ListView中做所有数据的展示。
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(); }; }; }
相关文章推荐
- C++程序员学Python:C与Python进行交互
- 如何不写代码通过爬虫软件采集表格数据
- Canvas基础(二)
- http://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=4
- tinypy源码笔记(二)——目录及构建分析
- ThinkPHP5修改默认的程序入口
- MIT6.828 Part B: Copy-on-Write Fork
- SSH互信配置失败
- leetcode.372. Super Pow
- 无监督特征学习——Unsupervised feature learning and deep learning
- 线程
- aws devops
- 【爬虫-反爬虫】系列一:反爬虫之签名(6)
- mysql-mmm实战安装
- http://my.oschina.net/chinacion/blog/647641
- Java基础六
- 用C#语言实现八皇后问题
- Android 全局异常捕获
- 显示更多和收起
- dataTables插件-四种数据来源