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

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 17:57   45   0

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




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP