问题描述
- Android怎么实现把子线程接收到的实时数据传送给UI界面并用textview显示 40C
- Android蓝牙模块接受到的输入流要显示在程序中另一个Activit中,并且实时更新数据,哪位大神help一下啊
解决方案
你可以百度一下EventBus这个工具,如果有不懂的可以问我。
解决方案二:
在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的自动更新。
解决方案三:
用handler处理一下就行了。
解决方案四:
每个界面都有自己的UI线程
解决方案五:
在子线程中使用Handler发送消息,在HanDler中处理UI的更新
解决方案六:
建议你去看一下handler的知识,还有UI线程与非UI线程的关系。
《Android疯狂讲义》 李刚的书 可以自己看一下这一部分的章节。
解决方案七:
你的问题主有有两个:
1、子线程去UI操作怎么做:
这点上面都有回答了,总之就一个诀窍,一定要放在主线程操作UI就行,可用Handler,view.post()AsyncTask等等都可以;
2、不同Activity之间如何消息传递:
这个,我建议你了解一些监听器的实现原理,或者看看监听者模式,你在ActivityA去监听ActivityB即可,主要是回调。EventBus的实现原理也是如此的,如果你自己不想写,就用EventBus这个框架,不过我建议你还是自己写
解决方案八:
你可以看看这个例子
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//你要完成的工作 100//每隔多长时间触发一次 ); btnStart.setEnabled(false); }});
}
}
解决方案九:
最简单的方法是使用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就可以进行布局的操作
解决方案十:
最简单的方法是使用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就可以进行布局的操作