當前位置:首頁 » 安卓系統 » androidviewstub

androidviewstub

發布時間: 2022-09-02 18:57:00

① 如何對android客戶端性能優化

性能優化是一個大的范疇,如果有人問你在Android中如何做性能優化的,也許都不知道從哪開始說起。
首先要明白的是,為什麼我們的App需要優化,最顯而易見的時刻:用戶say,什麼狗屎,刷這么久都沒反應,取關卸載算了。
這跟什麼有關,我們先蒼白的反駁下,尼瑪用戶設備老舊網又爛,關我屁事,根本不用優化。可是,老闆拍板了,施壓給CTO,然後CTO又來找你:Y的今天必須給我想辦法優化了,不然不準回家。
好吧,為什麼從UI的表象上看,App又卡又慢而且還錯亂。我們試著來剖析下吧。
題外話:把minSDK改到4.0+,去特么的low用戶,連手機都不願意換,還能指望它能給你帶來多少營收么,直接pass掉吧。4.0前的系統bug不少,不能為了彌補這些bug而降低了整體的高性能。
好了,讓我們先從UI說起:
首先要明白的是UI的繪制流程:measure-layout-draw,measure與layout都需要for loop所有的子控制項,匯集起來才能完成繪制,布局。所以子控制項越多,所消耗的時間越長(inflate,layout_weight,relative,多層嵌套等),減少不必要的子控制項或層級,是相當有必要的。你可以通過merge,viewstub這些標簽來減少層級嵌套。如果你的空間觀念沒那麼好,可以用HierarchyViewer工具來檢查。
對於Listview或者GridView這種多item的組件來說,復用item可以減少inflate次數,通過setTag,getTag的ViewHolder方式實現復用,這里要注意的是,holder中的控制項最好reset後再賦值,避免圖片,文字錯亂。
對於ViewPager第一次顯示時卡頓以及左右滑動卡頓,有以下幾種優化方式:

ViewPager同時緩存page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。
每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入數據,以免造成浪費
圖片顯示不出來或者載入時間太長,怎麼辦?分兩部分,下載速度,載入速度。

對於下載,要控制好同時下載的最大任務數(平均速度慢),同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)。
對於載入速度,我們要知道一點,雖然下載的圖片可能只有幾百K,但是decode成bitmap所佔用的內存可是成倍的,盡可能的減小圖片size是根本因素,讓服務端提供不同解析度的圖片才是最好的解決方案,內存總有耗盡的時刻,別老想著大解析度會更清晰,實際就只有150*150的空間,非給弄張1000*1000的圖片是不恰當的。另外論載入速度:內存>硬碟>網路,合理的使用內存緩存也是關鍵。假如自己寫不好,沒關系,有那麼多開源的圖片緩存框架,不用自己操心。
再說緩存
有很多種緩存方式,也不用Stay列舉了,我們要說的是搭配使用。

比方說,以前我們一直在用強引用,HashMap,後來我們發現占內存,我們就用軟引用,弱引用來及時回收,再後來因為回收機制不可控,所以又有了lrucache,disklrucache通過演算法來平衡內存與硬碟緩存。隨著android版本的推進與演化,我們也應該擁抱變化。如果你的App里還有軟引用,弱引用的地方,不妨再check下。
比方說網路+資料庫。網路我們一般都是去主動獲取,而非被動接受。那如果說數據是重復的或者未更改的呢?那我們去取一次網路數據有什麼意義呢?我的解決方案是給每個activity或fragment或每個組件設置一個最大請求間隔,比如一個listview,第一次請求數據時,保存一份到資料庫,並記下時間戳,當下次重新初始化時,判斷是否超過最大時間間隔(如5分鍾),如果沒有,只載入資料庫數據,不需要再做網路請求。當然,還有一些隱式的http請求框架會緩存伺服器數據,在一定時間內不再請求網路,或者當伺服器返回304時將之前緩存的數據直接返回。
反正也說到網路了,那我們也來說說

現在有很多現成HTTP框架供我們使用,我們幾乎只用寫配置就可以搞定一個url請求,但是這里有很多需要服務端配合的,比如:json數據格式,WebP代替jpg,支持斷點續傳,多個請求合並成一個,盡量不做重定向,伺服器緩存以及負載均衡等。
對客戶端本身,除了上述的實現,我們還需要合理的緩存,控制最大請求並發量,及時取消已失效的請求,過濾重復請求,timeout時間設置,請求優先順序設置等。
優化可不是一個人的事,實現一個功能簡單,但是想優化重構,那是很不容易的事。需要多方面的預判與聯調。合理的假設與實踐是優化最重要的手段。
說完這些具體的點,我們再來說說一些常識,或者稱之為代碼規范。

你要知道for loop中不要聲明臨時變數,不到萬不得已不要在裡面寫try catch。
明白垃圾回收機制,避免頻繁GC,內存泄漏,OOM(有機會專門說)
合理使用數據類型,比如StringBuilder代替String,(筆試題最常見的是str+="str"中有幾個對象) ,少用枚舉enum,少用父類聲明(List,Map)
如果你有頻繁的new線程,那最好通過線程池去execute它們,減少線程創建開銷。
你要知道單例的好處,並正確的使用它。
多用常量,少用顯式的"action_key",並維護一個常量類,別重復聲明這些常量。
如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一發而動全身。需求變更不可怕,可怕的是沒有在寫代碼之前做合理的設計。
當然還有很多很多,Stay所說的也只是一個大的輪廓,還是需要自己不斷的嘗試。會開發寫代碼跟會做產品的區別還是蠻大的,僅僅是態度就能刷死80%的碼農了。當你碰到一些需要優化的地方,耐心的去分析,時間的累積會讓你成為真正的工程師。
另外優化也沒有絕對的完美,每一次優化都是基於當前的環境來做的,要明白溝通是最好的優化,不盲從,不隨便,三思而後行。
Android上如何做性能優化的?大概寫三年代碼就能差不多知道了。

② 如何通過技術優化讓Android程序變得流暢

Android APP優化的幾點考量:高效的使用多線程。1.在後台取消一些線程中的動作。App運行過程中所有的操作都默認在主線程(UI線程)中進行的,這樣App的響應速度就會受到影響。會導致程序陷入卡頓、死掉甚至會發生系統錯誤。為 了加快響應速度,需要把費時的操作(比如網路請求、資料庫操作或者復雜的計算)從主線程移動到一個單獨的線程中。最高效的方式就是在類這一級完成這項操作,可以使用AsyncTask或者IntentService來創建後台操作。2.保持響應不發生ANR。從UI線程中移除費時操作這個方式還可以防止用戶操作出現系統不響應(ANR)對話框。需要做的就是繼承AsyncTask來創建一個後台工作線程,並實現doInBackground()方法。3.在線程中初始化查詢操作。當查詢操作正在後台處理時,展示數據也不是即時的,可以使用CursorLoader對象來加快速度,這個操作可以使Activity和用戶之間的互動不受影響。使用這個對象後, App會為ContentProvider初始化一個獨立的後台線程進行查詢,當查詢結束後就會給調用查詢的Activity返回結果。4.其它需要注意的方面。使用StrictMode來檢查UI線程中可能潛在的費時操作;使用一些特殊的工具如Safe.ijiami、Systrace或者Traceview來尋找在你的應用中的瓶頸;優化設備的電池壽命。文本數據轉換,進行非JIT正則表達式操作。5.優化網路。如果沒有網路連接,讓應用跳過網路操作;只在有網路連接並且無漫遊的情況下更新數據;選擇兼容的數據格式,把含有文本數據和二進制數據的請求全部轉化成二進制數據格式請求;使用高效的轉換工具,多考慮使用流式轉換工具,少用樹形的轉換工具。

③ android 美團底部四個導航,小人奔跑載入數據時不影響頁卡切換是什麼原理

它的小人奔跑是動畫,不是dialog,不會阻塞activity。你可以這樣:
tab頁面使用viewstub,當剛切換過來時,請求網路把viewstub指向小人奔跑的頁面,當數據請求成功,使用數據visestub頁面替換。

④ android decorView下為什麼有個viewStub

這個主要是依據不同的style來定義的,具體你可以看一下這篇博文http://blog.csdn.net/qq_35071078/article/details/72859905

⑤ android中如何使一個imagebutton疊在另一個imagebutton上邊

使用FrameLayout或 RelativeLayout來布局

FrameLayout可以在同一位置多個疊加View

RelaviveLayout可以將一個View 置於另一個View之上,通過Margin 來控制的。

試試就知道了。。。

⑥ viewstub 和 include的區別

Android的UI界面都是由View和ViewGroup及其派生類組合而成的。
其中,View是所有UI組件的基類,而 ViewGroup是容納這些組件的容器,其本身也是從View派生出來的.
View對象是Android平台中用戶界面體現的基礎單位。
View類是它稱為「widgets(工具)」的子類的基礎,它們提供了諸如文本輸入框和按鈕之類的UI對象的完整實現。
ViewGroup類同樣為其被稱為「Layouts(布局)」的子類奠定了基礎,它們提供了象流式布局、表格布局以及相對布局之類的布局架構。

⑦ Android:ViewStub如何防止重復填充呢怎麼判斷ViewStub已經被inflate()了

有一個ViewStub.OnInflateListener,在inflate之後會調用。在裡面用個標志位標記下。

⑧ 誰知道android 中view 和Viewgroup的關系是什麼

View對象是Android平台中用戶界面體現的基礎單位。View類通常為「widgets(工具)」的子類的基礎,它們提供了諸如文本輸入框和按鈕之類的UI對象的完整實現。
ViewGroup類同樣為被稱為「Layouts(布局)」的子類奠定了基礎,它們提供了象流式布局、表格布局以及相對布局之類的布局架構。

Android的UI界面都是由View和ViewGroup及其派生類組合而成的。其中,View是所有UI組件的基類,而ViewGroup是容納這些組件的容器,其本身也是從View派生出來的。AndroidUI界面的一般結構可參見:


可見,作為容器的ViewGroup可以包含作為葉子節點的View,也可以包含作為更低層次的子ViewGroup,而子ViewGroup又可以包含下一層的葉子節點的View和ViewGroup。事實上,這種靈活的View層次結構可以形成非常復雜的UI布局,開發者可據此設計、開發非常精緻的UI界面。一般來說,開發Android應用程序的UI界面都不會直接實用View和ViewGroup,而是使用這兩大基類的派生類。下面我們列舉了android中View和ViewGroup的派生類。

View派生出的直接子類有:AnalogClock,ImageView,KeyboardView, ProgressBar,SurfaceView,TextView,ViewGroup,ViewStub

View派生出的間接子類有:AbsListView,AbsSeekBar, AbsSpinner, AbsoluteLayout, AdapterView<T extends Adapter>,AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, AutoCompleteTextView,Button,CalendarView, CheckBox, CheckedTextView, Chronometer, CompoundButton,

ViewGroup派生出的直接子類有:AbsoluteLayout,AdapterView<T extends Adapter>,FragmentBreadCrumbs,FrameLayout,LinearLayout,RelativeLayout,SlidingDrawer

ViewGroup派生出的間接子類有:AbsListView,AbsSpinner, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, CalendarView, DatePicker, DialerFilter, ExpandableListView, Gallery, GestureOverlayView,GridView,HorizontalScrollView, ImageSwitcher,ListView。

可以在秒秒學上看看Android的課程,講解的可以,希望對你有幫助。

⑨ android 布局優化使用什麼標簽

android 布局優化主要使用抽象布局標簽

(1) <include>標簽
include標簽常用於將布局中的公共部分提取出來供其他layout共用,以實現布局模塊化,這在布局編寫方便提供了大大的便利。
下面以在一個布局main.xml中用include引入另一個布局foot.xml為例。main.mxl代碼如下:

java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView
android:id="@+id/simple_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/dp_80" />

<include layout="@layout/foot.xml" />

</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/simple_list_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="@dimen/dp_80" /> <include layout="@layout/foot.xml" /> </RelativeLayout>
其中include引入的foot.xml為公用的頁面底部,代碼如下:

Java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_above="@+id/text"/>

<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_alignParentBottom="true"
android:text="@string/app_name" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="@dimen/dp_40" android:layout_above="@+id/text"/> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="@dimen/dp_40" android:layout_alignParentBottom="true" android:text="@string/app_name" /> </RelativeLayout>

<include>標簽唯一需要的屬性是layout屬性,指定需要包含的布局文件。可以定義android:id和android:layout_*屬性來覆蓋被引入布局根節點的對應屬性值。注意重新定義android:id後,子布局的頂結點i就變化了。(2) <viewstub>標簽
viewstub標簽同include標簽一樣可以用來引入一個外部布局,不同的是,viewstub引入的布局默認不會擴張,即既不會佔用顯示也不會佔用位置,從而在解析layout時節省cpu和內存。
viewstub常用來引入那些默認不會顯示,只在特殊情況下顯示的布局,如進度布局、網路失敗顯示的刷新布局、信息出錯出現的提示布局等。
下面以在一個布局main.xml中加入網路錯誤時的提示頁面network_error.xml為例。main.mxl代碼如下:

Java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

……
<ViewStub
android:id="@+id/network_error_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/network_error" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > …… <ViewStub android:id="@+id/network_error_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout="@layout/network_error" /> </RelativeLayout>

其中network_error.xml為只有在網路錯誤時才需要顯示的布局,默認不會被解析,示例代碼如下:

Java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button
android:id="@+id/network_setting"
android:layout_width="@dimen/dp_160"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="@string/network_setting" />

<Button
android:id="@+id/network_refresh"
android:layout_width="@dimen/dp_160"
android:layout_height="wrap_content"
android:layout_below="@+id/network_setting"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_10"
android:text="@string/network_refresh" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/network_setting" android:layout_width="@dimen/dp_160" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="@string/network_setting" /> <Button android:id="@+id/network_refresh" android:layout_width="@dimen/dp_160" android:layout_height="wrap_content" android:layout_below="@+id/network_setting" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/dp_10" android:text="@string/network_refresh" /> </RelativeLayout>

在java中通過(ViewStub)findViewById(id)找到ViewStub,通過stub.inflate()展開ViewStub,然後得到子View,如下:

Javaprivate View networkErrorView;

private void showNetError() {
// not repeated infalte
if (networkErrorView != null) {
networkErrorView.setVisibility(View.VISIBLE);
return;
}

ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);
networkErrorView = stub.inflate();
Button networkSetting = (Button)networkErrorView.findViewById(R.id.network_setting);
Button refresh = (Button)findViewById(R.id.network_refresh);
}

private void showNormal() {
if (networkErrorView != null) {
networkErrorView.setVisibility(View.GONE);
}
}
private View networkErrorView; private void showNetError() { // not repeated infalte if (networkErrorView != null) { networkErrorView.setVisibility(View.VISIBLE); return; } ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout); networkErrorView = stub.inflate(); Button networkSetting = (Button)networkErrorView.findViewById(R.id.network_setting); Button refresh = (Button)findViewById(R.id.network_refresh);} private void showNormal() { if (networkErrorView != null) { networkErrorView.setVisibility(View.GONE); }}

在上面showNetError()中展開了ViewStub,同時我們對networkErrorView進行了保存,這樣下次不用繼續inflate。這就是後面第三部分提到的減少不必要的infalte。

viewstub標簽大部分屬性同include標簽類似。上面展開ViewStub部分代碼

JavaViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);
networkErrorView = stub.inflate();
ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);networkErrorView = stub.inflate();
也可以寫成下面的形式

JavaView viewStub = findViewById(R.id.network_error_layout);
viewStub.setVisibility(View.VISIBLE); // ViewStub被展開後的布局所替換
networkErrorView = findViewById(R.id.network_error_layout); // 獲取展開後的布局
View viewStub = findViewById(R.id.network_error_layout);viewStub.setVisibility(View.VISIBLE); // ViewStub被展開後的布局所替換networkErrorView = findViewById(R.id.network_error_layout); // 獲取展開後的布局
效果一致,只是不用顯示的轉換為ViewStub。通過viewstub的原理我們可以知道將一個view設置為GONE不會被解析,從而提高layout解析速度,而VISIBLE和INVISIBLE這兩個可見性屬性會被正常解析。


⑩ Android2.2SDK下ViewStub很簡單的應用為什麼都會出異常

大概是因為那個應用不支持安卓2.3及更低的安卓版本。

熱點內容
j2ee和java的區別 發布:2025-01-12 03:42:44 瀏覽:581
android6小米 發布:2025-01-12 03:38:35 瀏覽:85
redis與資料庫 發布:2025-01-12 03:20:21 瀏覽:211
怎麼升級安卓100 發布:2025-01-12 03:19:37 瀏覽:516
c語言倒數 發布:2025-01-12 03:14:37 瀏覽:929
如何免費激活行動電話卡安卓 發布:2025-01-12 03:10:27 瀏覽:89
2020凱越精英配置什麼樣 發布:2025-01-12 03:08:02 瀏覽:685
奧特曼空想特攝要怎麼樣的配置 發布:2025-01-12 03:08:01 瀏覽:998
空氣能的壓縮機 發布:2025-01-12 03:05:55 瀏覽:480
java字元串圖片 發布:2025-01-12 03:04:31 瀏覽:341