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();
		};
	};
}




  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值