android子線程更新ui
⑴ 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的方式有幾種
使用Handler,主線程中定義Handler處理更新UI,)子線程發消息,通知Handler完成UI更新。
用Activity對象的runOnUiThread方法更新 ,在在子線程中通過runOnUiThread()方法更新UI。
調用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,應該算是內部類了。