开发者社区> 问答> 正文

Android如何实现把子线程接收到的实时数据传送给UI界面并用textview显示

Android蓝牙模块接受到的输入流要显示在程序中另一个Activit中,并且实时更新数据

展开
收起
爵霸 2016-06-14 10:45:05 9807 0
4 条回答
写回答
取消 提交回答
  • 主线程中运行子线程的回调,ui更改都需要再主线程中进行,建议看下handler

    2019-07-17 19:36:58
    赞同 展开评论 打赏
  • 这种情况如果发送频率不高一般会发广播。并且监听蓝牙的线程最好单独运行在一个单例上防止被释放。

    2019-07-17 19:36:57
    赞同 展开评论 打赏
  • Android UI线程非安全
    不能在工作线程中操作UI,所有UI操作必须在主线程(又名UI线程)两个原则:

    1. Do not block the UI thread(不要在UI线程中做耗时的工作,阻塞线程);
    2. Do not access the Android UI toolkit from outside the UI thread(不要在非主线程
      操作UI)

    非主线程处理后的数据需要更新至主线程UI界面,通常可以就需要用hannler处理。
    基本原理:主线程起来以后有一个MessageQueue,同时和该队列配对的有一个Looper,而子线程有这个MessageQueue的引用,子线程处理完以后就会向主线程的消息队列发消息,主线程轮询自己的队列,发现有未处理的消息就进行处理。

    class LooperThread extends Thread {
    public Handler mHandler;
    public void run() {
    Looper.prepare();
    mHandler = new Handler() {
    public void handleMessage(Message msg) {
    // process incoming messages here
    }
    };
    Looper.loop();
    }
    }

    2019-07-17 19:36:57
    赞同 展开评论 打赏
  • 在Android中规定只有UI thread可以更新界面,但是我们开发中会经常遇到一些耗时的操作,这些操作可能会很花费时间,最终的结果却要更新到UI上
    这种情况下,如果我们将这个操作放到UI thread中做就很可等挡住UI线程,从而导致ANR Application Not Responding,因此我们都会new一个工作
    线程,在这个线程中做复杂的耗时操作,待得到结果后,再将结果更新到UI。
    子线程获取数据,更新UI的方法大概有这样几种:
    1、通过AsyncTask+progressbar的方法,在AsyncTask的doInBackground()中做耗时的操作,在onProgressUpdate(Progress…) 中更新UI(进度条)
    此方法在主线程执行,用于显示任务执行的进度。onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
    2、通过Handler的方法,从子线程中发消息Msg,在Handler中处理该消息(在UI thread中执行),并updateUI。
    3、如果你的界面是listView的形式,不妨用listAdapter绑定数据库,在子线程接收到实时数据跟新到provider中,然后触发listView的自动更新。

    2019-07-17 19:36:57
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载