androidui更新
① android如何实现在for循环中更新UI
一般也是最简单的方式就是 通过创建Handler对象,在handMessage方法里面更新UI组件
② android 怎样发送广播更新ui
更新ui 可以直接在主线程里操作。一般用不到广播。如果非要用广播,一般都是服务更新线程才这么做。在服务里注册/发送广播。然后在ui线程里接受广播,执行更新操作。
③ Android 5.0界面切换的UI更新问题
挺不错的设计.
在实际上手 5.0 之前, 我也一度对这个界面的实际效果产生怀疑, 但是实际上手之后发现自己多虑了.
首先, 新的多任务界面在 Nexus 4 上可以最多显示清楚五个应用 (第五个应用的标题会被略遮住一些, 第六个往后会露出一条缝, 只能看出颜色), 在 4.X 上最多能显示四个. 另外, 卡片的 App Bar 可以跟随应用改变颜色 (比如 Gmail 卡就是红色的
Bar, Keep 就是黄色, Messenger 就是蓝色, 等等), 也增加了应用的识别度. 而 4.X Recents 界面里的缩略图识别度其实很低, 的大部分时候还是要靠图标和标题 —— 而实际上在 5.0 中, 标题和图标的大小并没有缩小.
④ Android更新UI界面的几种方法的使用
1. 利用Android Handler机制和message消息传递
我们知道 , Android Handler机制主要用作线程之间的通信,为了易于理解,我们暂不考虑每个线程的Looper问题。UI更新一般是在主线程中完成的,而Handler就是定义在主线程中,然后通过在Handler构造方法中重写HandlerMessage()方法,来处理有其他线程(子线程)传递过来的消息,从而达到更新UI的目的。相应的,在其他线程(子线程)中,我们通过SendMessage(message)方法来传递消息。
2.利用Android Handler机制和post
这个比较容易理解,也是UI更新常用的方法。 在一个新建的线程中进行更新界面的操作,然后在主线程中利用mHandler.post(Runnable runnable)来达到更新界面的目的,其中mHandler是在主线程中定义的。
3、通过runOnUiThread()方法来实现
java">classMyThreadextendsThread{
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
super.run();
//数据处理
//...
runOnUiThread(newnewRunnable(){
publicvoidrun(){
//刷新界面
list.add(dog);
adapter.notifyDataSetChanged();
}
}
})
}
⑤ android中如何实现UI的实时更新
1、在主线程中启动一个子线程
首先,我们需要在主线程中启动一个子线程,这个比较简单,直接在MainActivity的onCreate()方法中调用如下方法即可:
newThread(mRunnable).start();
2、在子线程中发送Message给Handler
在创建子线程时,我们使用了Runnable接口对象mRunnable。这里,只需要实现Runnable接口,并重写该接口的run()方法,在run()方法中实现每1秒发送一条Message给Handler即可。具体实现方法如下:
/*
*Function:实现run()方法,每1秒发送一条Message给Handler
*/
privateRunnablemRunnable=newRunnable(){
publicvoidrun(){
while(true){
try{
Thread.sleep(1000);
mHandler.sendMessage(mHandler.obtainMessage());
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
};
3、Handler接收Message通知
最后,我们创建一个Handler对象,用来接收Message通知。在收到Message通知后,完成刷新UI的操作即可。具体实现方法如下:
/*
*Function:实现handleMessage()方法,用于接收Message,刷新UI
*/
privateHandlermHandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
refreshUI();
}
};
4、刷新UI
由以上的代码可以看出,刷新UI的操作,我们是放在refreshUI()方法中来完成的。refreshUI()方法的实现也很简单,调用HttpUtils工具类中的getInputStream()方法,获得图1所示Web工程的页面内容输入流,再将该输入流转化为字符串,放入TextView控件中进行显示即可。具体实现方法如下:
/*
*Function:刷新UI
*/
privatevoidrefreshUI(){
try{
InputStreaminputStream=HttpUtils.getInputStream();
StringresultData=HttpUtils.getResultData(inputStream);
mTextView.setText(resultData);
}catch(IOExceptione){
e.printStackTrace();
}
}
⑥ Android更新Ui的几种方法和见解
利用Looper更新UI界面
2.AsyncTask利用线程任务异步更新UI界面
3.利用Runnable更新UI界面
⑦ Android service 可以直接更新UI吗
就算是在Activity的开启的新线程中也是无法直接更新UI的,若这样做会导致应用崩溃,Android限制要求在UI线程中即主线程中才能更新UI,这样做的目的是为了防止多线程同时修改同一个控件导致各种问题的产生,若要在其他新建的线程中更新UI需要借助API中提供的handler。
原理大致为在主线程中实现处理特定消息的接口,然后在其他地方使用handler发送自己定义的消息,当主线程接收到消息后,你就可以根据消息的内容更新UI了。
当然也有特例,如SurfaceView就支持在新线程中修改UI。service属于后台与Avtivity属于不同的组件,运行在不同的线程下,它的设计不是为了处理界面的,所以不建议这么做。
下面是几个可行的方法:
通过广播,即在 Activity中注册一个广播,然后通过广播进行service和Activity间的数据传递,同时以达到更新UI的目的。
通过继承Binder类和一个回调方法实现对view的更新。当然如果不要回调方法也可以,那就直接在handleMessage()中进行数据更新也是可以。
⑧ android通过Handler使子线程更新UI
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法。
一. 引言
首先来看一下android中消息机制:
专业术语:
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
二. 方法
1. 用Handler
(1)主线程中定义Handler:
Java代码:
[java]view plain
HandlermHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
switch(msg.what){
case0:
<spanstyle="color:#009900;">//完成主界面更新,拿到数据</span>
Stringdata=(String)msg.obj;
updateWeather();
textView.setText(data);
break;
default:
break;
}
}
};
(2)子线程发消息,通知Handler完成UI更新:
java代码:
privatevoipdateWeather(){
newThread(newRunnable(){
@Override
publicvoidrun(){
<spanstyle="color:#009900;">//耗时操作,完成之后发送消息给Handler,完成UI更新;</span>
mHandler.sendEmptyMessage(0);
<spanstyle="color:#33cc00;">//需要数据传递,用下面方法;</span>
Messagemsg=newMessage();
msg.obj="数据";<spanstyle="color:#33cc00;">//可以是基本类型,可以是对象,可以是List、map等;</span>
mHandler.sendMessage(msg);
}
}).start();
}
注意:Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用。
2.用Activity对象的runOnUiThread方法更新
在子线程中通过runOnUiThread()方法更新UI:
java代码:
newThread(){
publicvoidrun(){
<spanstyle="color:#009900;">//这儿是耗时操作,完成之后更新UI;</span>
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
<spanstyle="color:#009900;">//更新UI</span>
imageView.setImageBitmap(bitmap);
}
});
}
}.start();
如果在非上下文类中,可以通过传递上下文实现调用:
java代码:
Activityactivity=(Activity)imageView.getContext();
activity.runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
imageView.setImageBitmap(bitmap);
}
});
注意:这种方法使用比较灵活,但如果Thread定义在其他地方,需要传递Activity对象。
3.
View.post(Runnable r)
java代码:
imageView.post(newRunnable(){
@Override
publicvoidrun(){
imageView.setImageBitmap(bitmap);
}
});
这种方法更简单,但需要传递要更新的View过去。
总结:UI的更新必须在主线程中完成,所以不管上述那种方法,都是将更新UI的消息发送到了主线程的消息对象,让主线程做处理。
⑨ android怎么更新UI
首先,android的UI刷新是在主线程(UI线程)中完成的。四大组件中,activity和service运行在主线程中。现在总结自己在项目中常用到的UI刷新方式。
第一,利用子线程发消息刷新UI。
子线程负责处理UI需要的数据,然后发消息到主线程来刷新UI。代码结构如下:
new Thread(new Runnable() {
@Override
public void run() {
Person person=new Person();
person.setName(mName.getText().toString().trim());
person.setPhone(mPhone.getText().toString().trim());
Log.i("person",person.toString());
DatabaseInfoFactory.getPersonDao(mContext).addPerson(person);
Looper.prepare();
Message msg=Message.obtain();
msg.what=0x123456;
handler.sendMessage(msg);
Looper.loop();
}
}).start();
主线程中:
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==0x123456||msg.what==0x123){
fillData();
setListener();
}
}
};
第二,利用异步任务更新UI。代码结构如下:
new AsyncTask<void,void,void>() {
@Override
protected void onPostExecute(Void result) {
if(mAdapter==null){
mAdapter=new LeaveInfoAdapter();
//设置数据适配器
mLVleaveInfos.setAdapter(mAdapter);
Log.i("测试", "异步任务显示后台获得数据库数据");
}
else {
mAdapter.notifyDataSetChanged();
}
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... params) {
//获得要显示的数据
mleaveInfos=mLeaveInfosDao.findAll();
if (mleaveInfos==null) {
Toast.makeText(HomeActivity.this,"请假数据不存在或是已经清除!", 500).show();
}
Log.i("测试", "异步任务后台获得数据库数据"+mleaveInfos.size());
return null;
}
}.execute();</void,void,void>
第三,利用配置文件+activity的生命周期方法刷新UI。
⑩ Android 在子线程中更新UI的几种方法示例
请您慢慢看:
直接在UI线程中开启子线程来更新TextView显示的内容,运行程序我们会发现,如下错误:android.view.ViewRoot$: Only the original thread that created a view hierarchy can touch its views.翻译过来就是:只有创建这个控件的线程才能去更新该控件的内容。
所有的UI线程要去负责View的创建并且维护它,例如更新冒个TextView的显示,都必须在主线程中去做,我们不能直接在UI线程中去创建子线程,要利用消息机制:handler,如下就是handler的简单工作原理图:
既然android给我们提供了Handler机制来解决这样的问题,请看如下代码:
public class HandlerTestActivity extends Activity { private TextView tv; private static final int UPDATE = 0; private Handler handler = new Handler() { @Overridepublic void handleMessage(Message msg) { // TODO 接收消息并且去更新UI线程上的控件内容if (msg.what == UPDATE) { // Bundle b = msg.getData();// tv.setText(b.getString("num")); tv.setText(String.valueOf(msg.obj)); } super.handleMessage(msg); } }; /** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.tv); new Thread() { @Overridepublic void run() { // TODO 子线程中通过handler发送消息给handler接收,由handler去更新TextView的值try { for (int i = 0; i < 100; i++) { Thread.sleep(500); Message msg = new Message(); msg.what = UPDATE; // Bundle b = new Bundle();// b.putString("num", "更新后的值:" + i);// msg.setData(b); msg.obj = "更新后的值:" + i; handler.sendMessage(msg); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }}
我们就通过Handler机制来处理了子线程去更新UI线程控件问题,Andrid开发中要经常用到这种机制。