您的位置:首页 > 其它

handler通信(子线程传数据到主线程)

2016-07-09 18:06 239 查看
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();
};
};
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: