当前位置:首页 » 安卓系统 » android子线程更新ui

android子线程更新ui

发布时间: 2022-01-10 06:38:53

⑴ Android中如何在子线程执行任务完成后更新UI

UI线程不能阻塞,一旦超过5秒,会造成ARN问题。

你的问题可以做一个假的提示,当你进行保存方法的时候弹出一个进度窗口,不让它可以让用户关闭,完成你所要的操作,关闭进度窗口。造成你所需要的假象即可,

⑵ Android 可以通过子线程直接更新的控件有哪些,UI线程与主线程真是一个神奇的东西,求高手~~

先给你提示一下。android中更新UI只能用UI线程,即主线程。 这样说吧 ui线程== 主线程。

1 想要在子线程中数据发生改变更新主线程的ui,可以通过消息机制,message和handler结合的方式,比较好用。
2 还可以 用特定的控件的方法,比如ListView的adapter中的notifydatachang().好像是这个方法
3 在view中还可以在数据变化后用invalidata()或者postInvalidata()这两个方法。

基本上就这几种常见的,希望可以帮你,大家都来讨论。

⑶ android中在子线程中更新UI的几种方法

照搬一个我自己的回答
..com/question/1822980438413918108

public class passWebViewInNewThread{ static android.os.Handler h=null; static WebView w=null; public static void getWebView(WebView w0){//有点想不起来webview的类名是啥了,强答 w=w0; h=new android.os.Handler();//请用UI线程来运行这段代码 } public static void doWithWebView(){ new Thread() {//开新线程 @Override public void run() { try {//里面写新线程执行内容 /* XXX 耗时内容…… */ h.post(new Runnable(){//用handler转交UI处理操作 @Override public void run(){ //在这写操作webview的代码 //请不要在这里放耗时代码,否则会卡住UI线程 } }); }catch(Exception e){ } } }.start(); }}//PS:因为我已经不记得如果对象声明在方法内部如何用final,所以索性写成这样。没环境写java,所以可能有几个小错误

⑷ android中子线程中更新ui的方式有几种

  1. 使用Handler,主线程中定义Handler处理更新UI,)子线程发消息,通知Handler完成UI更新。

  2. 用Activity对象的runOnUiThread方法更新 ,在在子线程中通过runOnUiThread()方法更新UI。

  3. 调用View.post(Runnable r) 。

⑸ 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开发中要经常用到这种机制。

⑹ Android可不可以在子线程中更新UI

public class passWebViewInNewThread{
static android.os.Handler h=null;
static WebView w=null;
public static void getWebView(WebView w0){//有点想不起来webview的类名是啥了,强答
w=w0;
h=new android.os.Handler();//请用UI线程来运行这段代码
}
public static void doWithWebView(){
new Thread() {//开新线程
@Override public void run() {
try {//里面写新线程执行内容
/*
XXX 耗时内容……
*/
h.post(new Runnable(){//用handler转交UI处理操作
@Override public void run(){
//在这写操作webview的代码
//请不要在这里放耗时代码,否则会卡住UI线程
}
});
}catch(Exception e){
}
}
}.start();
}
}
//PS:因为我已经不记得如果对象声明在方法内部如何用final,所以索性写成这样。没环境写JAVA,所以可能有几个小错误

⑺ android studio子线程更新UI 问题

子线程更新UI,直接使用handler类即可。

⑻ 如何在android一条单独线程,更新ui

方法有两种:
通过继承Thread类,重写Run方法来实现
通过继承接口Runnable实现多线程
主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

Handler的主要作用:主要用于异步消息的处理

Handler的运行过程:
当(子线程)发出一个消息之后,首先进入一个(主线程的)消息队列,发送消息的函数即刻返回,而在主线程中的Handler逐个的在消息队列中将消息取出,然后对消息进行处理。这样就实现了跨线程的UI更新(实际上还是在主线程中完成的)。
这种机制通常用来处理相对耗时比较长的操作,如访问网络比较耗时的操作,读取文大文件,比较耗时的操作处理等。

在大白话一点的介绍它的运行过程:
启动应用时Android开启一个主线程
(也就是UI线程) , 如果此时需要一个耗时的操作,例如:
联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象(这也就是你在主线程中直接访问网络时会提示你异常的原因,如我们上篇文章所述Android主线程不能访问网络异常解决办法)。

⑼ 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

针对于b情况,你尝试下在类中新建一个thread,然后在button的setOnClickListener中调用,应改没有问题。如果在button的setOnClickListener,应该算是内部类了。

热点内容
上网的账号和密码是什么东西 发布:2024-09-20 16:31:31 浏览:611
安卓手机王者荣耀如何调超高视距 发布:2024-09-20 16:31:30 浏览:427
安卓G是什么app 发布:2024-09-20 16:23:09 浏览:80
iphone怎么压缩文件 发布:2024-09-20 16:08:18 浏览:355
linux查看用户名密码是什么 发布:2024-09-20 16:03:20 浏览:743
mac执行python脚本 发布:2024-09-20 15:58:52 浏览:777
单片机android 发布:2024-09-20 09:07:24 浏览:765
如何提高三星a7安卓版本 发布:2024-09-20 08:42:35 浏览:664
如何更换服务器网站 发布:2024-09-20 08:42:34 浏览:311
子弹算法 发布:2024-09-20 08:41:55 浏览:289