欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

android的UI更新,安卓更新界面

淺談Android幾種更新UI的方式

1、一般主線程可以直接更新UI

創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元鄢陵做網(wǎng)站,已為上家服務(wù),為鄢陵各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

2、runOnUiThread

3、Task-onPostExecute

Android開發(fā)中多線程與UI更新

直接在UI線程中開啟子線程來更新TextView顯示的內(nèi)容,運行程序我們會發(fā)現(xiàn),如下錯誤:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.翻譯過來就是:只有創(chuàng)建這個控件的線程才能去更新該控件的內(nèi)容。

所有的UI線程要去負(fù)責(zé)View的創(chuàng)建并且維護(hù)它,例如更新冒個TextView的顯示,都必須在主線程中去做,我們不能直接在UI線程中去創(chuàng)建子線程,要利用消息機(jī)制:handler,如下就是handler的簡單工作原理圖:

既然android給我們提供了Handler機(jī)制來解決這樣的問題,請看如下代碼:

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線程上的控件內(nèi)容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發(fā)送消息給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機(jī)制來處理了子線程去更新UI線程控件問題,Andrid開發(fā)中要經(jīng)常用到這種機(jī)制。

Android異步更新UI的幾種方法

android中有下列幾種異步更新ui的解決辦法:

Activity.runOnUiThread(Runnable)

View.post(Runnable)

long) View.postDelayed(Runnable, long)

使用handler(線程間通訊)(推薦)

AsyncTask(

android中如何實現(xiàn)UI的實時更新

1、在主線程中啟動一個子線程

首先,我們需要在主線程中啟動一個子線程,這個比較簡單,直接在MainActivity的onCreate()方法中調(diào)用如下方法即可:

new?Thread(mRunnable).start();

2、在子線程中發(fā)送Message給Handler

在創(chuàng)建子線程時,我們使用了Runnable接口對象mRunnable。這里,只需要實現(xiàn)Runnable接口,并重寫該接口的run()方法,在run()方法中實現(xiàn)每1秒發(fā)送一條Message給Handler即可。具體實現(xiàn)方法如下:

/*

*?Function???:???實現(xiàn)run()方法,每1秒發(fā)送一條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通知

最后,我們創(chuàng)建一個Handler對象,用來接收Message通知。在收到Message通知后,完成刷新UI的操作即可。具體實現(xiàn)方法如下:

/*

*?Function???:???實現(xiàn)handleMessage()方法,用于接收Message,刷新UI

*/

private?Handler?mHandler?=?new?Handler()?{

public?void?handleMessage(Message?msg)?{

super.handleMessage(msg);

refreshUI();

}

};

4、刷新UI

由以上的代碼可以看出,刷新UI的操作,我們是放在refreshUI()方法中來完成的。refreshUI()方法的實現(xiàn)也很簡單,調(diào)用HttpUtils工具類中的getInputStream()方法,獲得圖1所示W(wǎng)eb工程的頁面內(nèi)容輸入流,再將該輸入流轉(zhuǎn)化為字符串,放入TextView控件中進(jìn)行顯示即可。具體實現(xiàn)方法如下:

/*

*?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刷新機(jī)制

Android屏幕的刷新包含3個步驟:CPU計算屏幕數(shù)據(jù)、GPU進(jìn)一步處理和緩存、最后屏幕(Display)再從緩存中把計算的屏幕數(shù)據(jù)顯示出來

對于 Android 而言,第一個步驟: CPU 計算屏幕數(shù)據(jù) 指的也就是 View 樹的繪制過程,也就是 Activity 對應(yīng)的視圖樹從根布局 DecorView 開始層層遍歷每個 View,分別執(zhí)行測量、布局、繪制三個操作的過程。我們重點分析的也是這個步驟,關(guān)于后續(xù)的2個步驟我們可以理解為底層處理,沒必要過于深入。

我們知道Android每隔16.6ms會發(fā)送一次垂直同步VSync信息量,1S也就是60幀的畫面。下面這個圖藍(lán)色的是CPU計算屏幕數(shù)據(jù)時間戳,綠色的是GPU的處理,最后黃色的是屏幕。我們可以清楚的看到,每幀的畫面都會提前一幀去計算以及GPU處理。

如果我們保持頁面靜止,那么Android還是會16.6ms發(fā)送一次垂直同步信號量,App這個時候接受不到屏幕刷新的信號。所以也就不會讓 CPU 去計算下一幀畫面數(shù)據(jù),但是底層仍然會以固定的頻率來切換每一幀的畫面,只是它后面切換的每一幀畫面都一樣,所以給我們的感覺就是屏幕沒刷新

我們都知道Android的刷新離不開ViewRootImpl,在上一篇文章 《Android中UI的繪制流程》 中,大致闡述了Android的UI刷新流程。這里我們進(jìn)一步深入的理解源碼,以及刷新UI的詳細(xì)流程。首先看圖:

當(dāng)前名稱:android的UI更新,安卓更新界面
轉(zhuǎn)載來源:http://chinadenli.net/article42/dsiecec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、網(wǎng)站設(shè)計虛擬主機(jī)、網(wǎng)站策劃、標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)