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,//你要完成的工作
0,//延迟时间
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就可以进行布局的操作
呃。。。最简单的方式就是使用回调函数。。。当获取得到相应的数据再调用相应的方法执行相应的功能就行了吧
1.同一个Activity中可以使用hanlder发送消息进行界面更新
2.不同Activity中可以使用LocalBroadcastManager来发本地广播