网站建设资讯

NEWS

网站建设资讯

android更新ui,android更新版本下载

android怎么更新UI

首先,android的UI刷新是在主线程(UI线程)中完成的。四大组件中,activity和service运行在主线程中。现在总结自己在项目中常用到的UI刷新方式。

网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于成都定制网站,高端网页制作,对人造雾等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业营销推广优化,H5建站,响应式网站。

第一,利用子线程发消息刷新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 AsyncTaskvoid,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的几种方法和见解

利用Looper更新UI界面

2.AsyncTask利用线程任务异步更新UI界面

3.利用Runnable更新UI界面

android中如何实现UI的实时更新

1、在主线程中启动一个子线程

首先,我们需要在主线程中启动一个子线程,这个比较简单,直接在MainActivity的onCreate()方法中调用如下方法即可:

new Thread(mRunnable).start();

2、在子线程中发送Message给Handler

在创建子线程时,我们使用了Runnable接口对象mRunnable。这里,只需要实现Runnable接口,并重写该接口的run()方法,在run()方法中实现每1秒发送一条Message给Handler即可。具体实现方法如下:

/*

* Function   :   实现run()方法,每1秒发送一条Message给Handler

*/

private Runnable mRunnable = new Runnable() {

public void run() {

while(true) {

try {

Thread.sleep(1000);

mHandler.sendMessage(mHandler.obtainMessage());

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

};

3、Handler接收Message通知

最后,我们创建一个Handler对象,用来接收Message通知。在收到Message通知后,完成刷新UI的操作即可。具体实现方法如下:

/*

* Function   :   实现handleMessage()方法,用于接收Message,刷新UI

*/

private Handler mHandler = new Handler() {

public void handleMessage(Message msg) {

super.handleMessage(msg);

refreshUI();

}

};

4、刷新UI

由以上的代码可以看出,刷新UI的操作,我们是放在refreshUI()方法中来完成的。refreshUI()方法的实现也很简单,调用HttpUtils工具类中的getInputStream()方法,获得图1所示Web工程的页面内容输入流,再将该输入流转化为字符串,放入TextView控件中进行显示即可。具体实现方法如下:

/*

* Function   :   刷新UI

*/

private void refreshUI() {

try {

InputStream inputStream = HttpUtils.getInputStream();

String resultData = HttpUtils.getResultData(inputStream);

mTextView.setText(resultData);

} catch (IOException e) {

e.printStackTrace();

}

}

Android UI线程

思考:

先必须了解下面2个问题

1.顾名思义 UI线程 就是刷新UI 所在线程

2.UI是单线程刷新

1.对Activity 来说 UI线程就是其主线程

2.对View来说 UI线程就是创建ViewRootImpl所在的线程

可以通过 WindowManager 内部会创建ViewRootImpl对象

好了,进入主题。我们来慢慢揭开面纱。

我们可以分别从几个方面切入

我们可能都有使用过 runOnUiThread 现在来看看的源码实现。

可以从上面的源码 看到

不是UI线程 就用Handler切到Handler所在的线程中,如果是UI线程直接就调用run方法。

Activity的创建:

1.Activity创建:mInstrumentation.newActivity

2.创建Context :ContextImpl appContextcreateBaseContextForActivity(r)

我们经常用这个方法干的事情就是,要么在onCreate中获取View宽高的值。要么就是在子线程中做一些耗时操作 ,然后post切到对应View所在的线程 来绘制UI操作。那么这个对应的线程就是UI线程了。

那么这个UI线程就一定是主线程吗?

接来继续来看。它的源码View:post

mAttachInfo 在dispatchAttachedToWindow 中被赋值 ,也就是在ViewRootImpl创建的时候,所以是创建ViewRootImpl所在的线程。

attachInfo 上面时候为null 呢?在ViewRootImpl 还没来得及创建的时候,ViewRootImpl 创建是在 “onResume" 之后。所以在 Activity 的 onCreate 去View.post 那么AttachInfo 是为null 。

当 AttachInfo == null 那么会调用 getRunQueue().post(action) 。

最终这个Runnable 被 缓存到 HandlerActionQueue 中。

直到ViewRootImpl 的 performTraversals 中 调用dispatchAttachedToWindow(mAttachInfo, 0);, 那么才会去处理 RunQueue() 中的Runnable。

来张图 便于理解这个流程

我们有时候去子线程操作UI的时候(如:requestLayout),会很经常见到下面的 报错日志:

Only the original thread that created a view hierarchy can touch its views

为什么会报这个错误呢?

翻译一下:只有创建视图层次结构的原始线程才能接触到它的视图。

也就是操作UI的线程要和ViewRootImpl创建的线程是同一个线程才行,并不是只有主线程才能更新UI啊。

ViewRootImpl创建的线程?那么 ViewRootImpl 在哪里被创建的呢?

从上图可以看到ViewRootImpl创建最开始是从 ActivityThread 的HandleResumeActivity中开始 一直 ViewRootImpl 创建,也就是说ViewRootImpl 对应的UI线程和 ActivityThread 在同一个线程 也就是主线程。

好了 通过上面的讲解,上面的问题相信你可以自己回答啦~


网页标题:android更新ui,android更新版本下载
URL标题:http://njwzjz.com/article/dsgjhsj.html