android 异步刷新 方法,android应用中实现异步更新UI的方法有哪些

本文详细介绍了在Android应用中实现异步更新UI的多种方法,包括Activity.runOnUiThread、View.post、Handler以及AsyncTask。文章通过示例代码展示了如何避免非UI线程更新UI导致的错误,并推荐使用Handler和AsyncTask来更有效地管理和更新UI。同时,提到了使用现代网络库如Volley和Okhttp能进一步简化异步加载和更新UI的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android应用中实现异步更新UI的方法有哪些

发布时间:2020-12-07 17:12:00

来源:亿速云

阅读:144

作者:Leah

android应用中实现异步更新UI的方法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

android中有下列几种异步更新ui的解决办法:Activity.runOnUiThread(Runnable)

View.post(Runnable)

long) View.postDelayed(Runnable, long)

使用handler(线程间通讯)(推荐)

AsyncTask(推荐)

对于下面这段代码:

public void onClick(View v) {

new Thread(new Runnable() {

public void run() {

Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");

mImageView.setImageBitmap(bitmap);

}

}).start();

}

这段代码是一个按钮点击事件的响应方法,当点击了这个按钮后开启了一个子线程去网络上加载图片,然后在这个线程中给imageView设置了图片(更新了ui),这段代码在非ui线程中更新了ui,运行会引发错误。

1. Activity.runOnUiThread:

通常,在Activity,我们可以使用Activity的runOnUiThread方法来更新ui。

如:

public void onClick(View v) {

new Thread(new Runnable() {

public void run() {

Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");

runOnUiThread(new Runnable() {

@Override

public void run() {

mImageView.setImageBitmap(bitmap);

}

});

}

}).start();

}

2. View.post(Runable)

View类及其子类提供了一个post(Runable)方法允许我们将我们要做的操作放到这个匿名Runable对象的run方法中,在这个方法里面我们可以直接更新ui。

如:

public void onClick(View v) {

new Thread(new Runnable() {

public void run() {

Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");

imageView.post(new Runnable() {

@Override

public void run() {

mImageView.setImageBitmap(bitmap);

}

});

}

}).start();

}

3. long) View.postDelayed(Runnable, long)

和View.post(Runable)方法一样,只是延迟第二个参数指定的时间后执行,而View.post(Runable)是立即执行。

public void onClick(View v) {

new Thread(new Runnable() {

public void run() {

Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");

imageView.postDelayed(new Runnable() {

@Override

public void run() {

mImageView.setImageBitmap(bitmap);

}

},2000);

}

}).start();

}

4. 使用Handler(推荐)

前面说道的几种方法当这种操作过多的时候,我们的代码会显得臃肿,代码及业务都难于管理控制,所以,当这类代码多的时候我们就应该采取Handler的方式了。

如:

new Thread(new Runnable() {

public void run() {

Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");

Message message = mHandler.obtainMessage();

message.what = 1;

message.obj = bitmap;

mHandler.sendMessage(message);

}

}).start();

Handler mHandler = new Handler(){

@Override

public void handleMessage(Message msg) {

switch (msg.what){

case 1:

Bitmap bitmap = (Bitmap) msg.obj;

imageView.setImageBitmap(bitmap);

break;

case 2:

// ...

break;

default:

break;

}

}

};

5. AsyncTask(推荐)

android为我们提供了异步任务AsyncTask,我们可以使用AsyncTask轻松地实现异步加载数据及更新ui。

如:

AsyncTask asyncTask = new AsyncTask() {

/**

* 即将要执行耗时任务时回调,这里可以做一些初始化操作

*/

@Override

protected void onPreExecute() {

super.onPreExecute();

}

/**

* 在后台执行耗时操作,其返回值将作为onPostExecute方法的参数

* @param params

* @return

*/

@Override

protected Bitmap doInBackground(String... params) {

Bitmap bitmap = loadImageFromNetwork(params[0]);

return bitmap;

}

/**

* 当这个异步任务执行完成后,也就是doInBackground()方法完成后,

* 其方法的返回结果就是这里的参数

* @param bitmap

*/

@Override

protected void onPostExecute(Bitmap bitmap) {

imageView.setImageBitmap(bitmap);

}

};

asyncTask.execute("http://example.com/image.png");

需要知道的是doInBackground方法工作在工作线程中,所以,我们在这个方法里面执行耗时操作。同时,由于其返回结果会传递到onPostExecute方法中,而onPostExecute方法工作在UI线程,这样我们就在这个方法里面更新ui,达到了异步更新ui的目的。

事实上,对于android的异步加载数据及更新ui,我们不仅可以选择AsyncTask异步任务,还可以选择许多开源的网络框架,如xUtils,Volley,Okhttp,…,这些优秀的网络框架让我们异步更新ui变得非常简单,而且,效率和性能也非常高。

看完上述内容,你们掌握android应用中实现异步更新UI的方法有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值