whatmake
whatmake
2015-08-06 02:55
采纳率: 0%
浏览 11.0k

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

12条回答 默认 最新

  • woshizisezise
    胖子爱你520 2015-08-06 03:16

    你可以百度一下EventBus这个工具,如果有不懂的可以问我。

    点赞 评论
  • IT80hcbz
    算法匠人 2015-08-06 03:20

    在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的自动更新。

    点赞 评论
  • crazy1235
    月盡天明 2015-08-06 08:45

    用handler处理一下就行了。

    点赞 评论
  • crazy1235
    月盡天明 2015-08-06 09:27

    每个界面都有自己的UI线程

    点赞 评论
  • ghost4j
    非典型伏地魔 2015-08-06 11:48

    在子线程中使用Handler发送消息,在HanDler中处理UI的更新

    点赞 评论
  • crazy1235
    月盡天明 2015-08-07 01:11

    建议你去看一下handler的知识,还有UI线程与非UI线程的关系。
    《Android疯狂讲义》 李刚的书 可以自己看一下这一部分的章节。

    点赞 评论
  • scnuxisan225
    scnuxisan225 2015-08-07 07:11

    你的问题主有有两个:
    1、子线程去UI操作怎么做:
    这点上面都有回答了,总之就一个诀窍,一定要放在主线程操作UI就行,可用Handler,view.post(),AsyncTask等等都可以;

    2、不同Activity之间如何消息传递:
    这个,我建议你了解一些监听器的实现原理,或者看看监听者模式,你在ActivityA去监听ActivityB即可,主要是回调。EventBus的实现原理也是如此的,如果你自己不想写,就用EventBus这个框架,不过我建议你还是自己写

    点赞 评论
  • qq_29470861
    小迈_949804781 2015-08-08 02:45

    你可以看看这个例子

    package com.example.mrwang.myapplication;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.TextView;

    import java.util.Timer;
    import java.util.TimerTask;
    /**

    • Created by MrWang on 2015/8/8.
      */
      public class Start extends Activity{

      ProgressBar pgBar;
      TextView tvShow;
      Button btnStart;
      int progress=0;
      Timer timer;
      Handler handler;
      TimerTask timerTask;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.start);

      pgBar=(ProgressBar)findViewById(R.id.pg);
      tvShow=(TextView)findViewById(R.id.tvShow);
      btnStart=(Button)findViewById(R.id.btStart);
      timer=new Timer();
      handler =new Handler() {
          @Override
          public void handleMessage(Message msg) {
              switch (msg.what){
                  case 0x001:
                      pgBar.setVisibility(View.VISIBLE);
                      pgBar.setProgress(progress);
                      tvShow.setVisibility(View.VISIBLE);
                      break;
                  case 0x002:
                      pgBar.setVisibility(View.INVISIBLE);
                      tvShow.setText("加载完成");
                      timerTask.cancel();
                      timer.cancel();
                      break;
              }
          }
      };
      timerTask =new TimerTask() {
          @Override
          public void run() {
              if(progress<100){
                  progress++;
                  handler.sendEmptyMessage(0x001);
              }else{
                  handler.sendEmptyMessage(0x002);
              }
          }
      };
      
      pgBar.setVisibility(View.INVISIBLE);
      tvShow.setVisibility(View.INVISIBLE);
      
      btnStart.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
      
              timer.schedule(timerTask,//你要完成的工作
                      0,//延迟时间
                      100//每隔多长时间触发一次
              );
              btnStart.setEnabled(false);
          }
      });
      

      }
      }

    点赞 评论
  • u010184245
    卖烧饼的小老头 2015-08-10 15:46

    最简单的方法是使用handler,在类里定义一个handler变量,例如:Hanler handler=new Hanler(){
    public void HanleMessage(Message msg){// 函数名不能变
    switch(msg.what){//msg.what一般传递线程里需要界面操作执行的操作
    Bundle bundle=new Bundler();
    bunle=msg.getData();从传过来的message数据中取出传过来的绑定数据的bundle对象
    String str=bundle.getString("string");//从bundle中取出数据
    text.setText(str);//具体操作
    }
    }
    };

    在接收线程里使用handle变量(该例子是把数据text传递到可以操作布局的handler里)
    String text="text";
    Message message=new Message();
    Bundle bunle=new Bundle();
    bundle.putString(text);
    message.setData(bundle);
    handler.sendMessage(message);

    这样就可以把线程里的string数据传递到handler里了,handler就可以进行布局的操作

    点赞 评论
  • u010184245
    卖烧饼的小老头 2015-08-10 15:47

    最简单的方法是使用handler,在类里定义一个handler变量,例如:Hanler handler=new Hanler(){
    public void HanleMessage(Message msg){// 函数名不能变
    switch(msg.what){//msg.what一般传递线程里需要界面操作执行的操作
    Bundle bundle=new Bundler();
    bunle=msg.getData();从传过来的message数据中取出传过来的绑定数据的bundle对象
    String str=bundle.getString("string");//从bundle中取出数据
    text.setText(str);//具体操作
    }
    }
    };

    在接收线程里使用handle变量(该例子是把数据text传递到可以操作布局的handler里)
    String text="text";
    Message message=new Message();
    Bundle bunle=new Bundle();
    bundle.putString(text);
    message.setData(bundle);
    handler.sendMessage(message);

    这样就可以把线程里的string数据传递到handler里了,handler就可以进行布局的操作

    点赞 评论
  • u011596810
    「已注销」 2015-08-12 03:29

    呃。。。最简单的方式就是使用回调函数。。。当获取得到相应的数据再调用相应的方法执行相应的功能就行了吧

    点赞 评论
  • oSanYeCao1234567
    RoidCoder 2016-07-28 07:20

    1.同一个Activity中可以使用hanlder发送消息进行界面更新
    2.不同Activity中可以使用LocalBroadcastManager来发本地广播

    点赞 评论

相关推荐