導航:首頁 > 操作系統 > androidview回收

androidview回收

發布時間:2023-01-29 03:27:03

1. android性能優化總結

常用的Android性能優化方法:

一、布局優化:

1)盡量減少布局文件的層級。

層級少了,繪制的工作量也就少了,性能自然提高。

2)布局重用 <include標簽>

3)按需載入:使用ViewStub,它繼承自View,一種輕量級控制項,本身不參與任何的布局和繪制過程。他的layout參數里添加一個替換的布局文件,當它通過setVisibility或者inflate方法載入後,它就會被內部布局替換掉。

二、繪制優化:

基於onDraw會被調用多次,該方法內要避免兩類操作:

1)創建新的局部對象,導致大量垃圾對象的產生,從而導致頻繁的gc,降低程序的執行效率。

2)不要做耗時操作,搶CPU時間片,造成繪制很卡不流暢。

三、內存泄漏優化:

1)靜態變數導致內存泄漏   比較明顯

2)單例模式導致的內存泄漏 單例無法被垃圾回收,它持有的任何對象的引用都會導致該對象不會被gc。

3)屬性動畫導致內存泄漏  無限循環動畫,在activity中播放,但是onDestroy時沒有停止的話,動畫會一直播放下去,view被動畫持有,activity又被view持有,導致activity無法被回收。

四、響應速度優化:

1)避免在主線程做耗時操作 包括四大組件,因為四大組件都是運行在主線程的。

2)把一些創建大量對象等的初始化工作放在頁面回到前台之後,而不應該放到創建的時候。

五、ListView的優化:

1)使用convertView,走listView子View回收的一套:RecycleBin 機制

主要是維護了兩個數組,一個是mActiveViews,當前可見的view,一個是mScrapViews,當前不可見的view。當觸摸ListView並向上滑動時,ListView上部的一些OnScreen的View位置上移,並移除了ListView的屏幕范圍,此時這些OnScreen的View就變得不可見了,不可見的View叫做OffScreen的View,即這些View已經不在屏幕可見范圍內了,也可以叫做ScrapView,Scrap表示廢棄的意思,ScrapView的意思是這些OffScreen的View不再處於可以交互的Active狀態了。ListView會把那些ScrapView(即OffScreen的View)刪除,這樣就不用繪制這些本來就不可見的View了,同時,ListView會把這些刪除的ScrapView放入到RecycleBin中存起來,就像把暫時無用的資源放到回收站一樣。

當ListView的底部需要顯示新的View的時候,會從RecycleBin中取出一個ScrapView,將其作為convertView參數傳遞給Adapter的getView方法,從而達到View復用的目的,這樣就不必在Adapter的getView方法中執行LayoutInflater.inflate()方法了。

RecycleBin中有兩個重要的View數組,分別是mActiveViews和mScrapViews。這兩個數組中所存儲的View都是用來復用的,只不過mActiveViews中存儲的是OnScreen的View,這些View很有可能被直接復用;而mScrapViews中存儲的是OffScreen的View,這些View主要是用來間接復用的。

2)使用ViewHolder避免重復地findViewById

3)快速滑動不適合做大量非同步任務,結合滑動監聽,等滑動結束之後載入當前顯示在屏幕范圍的內容。

4)getView中避免做耗時操作,主要針對圖片:ImageLoader來處理(原理:三級緩存)

5)對於一個列表,如果刷新數據只是某一個item的數據,可以使用局部刷新,在列表數據量比較大的情況下,節省不少性能開銷。

六、Bitmap優化:

1)減少內存開支:圖片過大,超過控制項需要的大小的情況下,不要直接載入原圖,而是對圖片進行尺寸壓縮,方式是BitmapFactroy.Options 采樣,inSampleSize 轉成需要的尺寸的圖片。

2)減少流量開銷:對圖片進行質量壓縮,再上傳伺服器。圖片有三種存在形式:硬碟上時是file,網路傳輸時是stream,內存中是stream或bitmap,所謂的質量壓縮,它其實只能實現對file的影響,你可以把一個file轉成bitmap再轉成file,或者直接將一個bitmap轉成file時,這個最終的file是被壓縮過的,但是中間的bitmap並沒有被壓縮。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);

七、線程優化:

使用線程池。為什麼要用線程池?

1、從「為每個任務分配一個線程」轉換到「在線程池中執行任務」

2、通過重用現有的線程而不是創建新線程,可以處理多個請求在創建銷毀過程中產生的巨大開銷

3、當使用線程池時,在請求到來時間 ,不用等待系統重新創建新的線程,而是直接復用線程池中的線程,這樣可以提高響應性。

4、通過和適當調整線程池的大小 ,可以創建足夠多的線程以使處理器能夠保持忙碌狀態,同時還可以防止過多線程相互競爭資源而使應用程序耗盡內存或者失敗。

5、一個App裡面所有的任務都放在線程池中執行後,可以統一管理 ,當應用退出時,可以把程序中所有的線程統一關閉,避免了內存和CPU的消耗。

6、如果這個任務是一個循環調度任務,你則必須在這個界面onDetach方法把這個任務給cancel掉,如果是一個普通任務則可cancel,可不cancel,但是最好cancel

7、整個APP的總開關會在應用退出的時間把整個線程池全部關閉。

八、一些性能優化建議:

1)避免創建過多對象,造成頻繁的gc

2)不要過多使用枚舉,枚舉佔用的空間比整型大很多

3)字元串的拼接使用StringBuffer、StringBuilder來替代直接使用String,因為使用String會創建多個String對象,參考第一條。

4)適當使用軟引用,(弱引用就不太推薦了)

5)使用內存緩存和磁碟緩存。

2. RecyclerView是如何使用的,闡述ViewHold和adapter的區別

首先,要明白RecyclerView是做什麼的?其次是為什麼要用RecyclerView?這里牽扯到RecyclerView和ListView的區別,這里不廢話,大家自行網路即可!

以下示例我用的Android API 29 ,啟用了AndroidX。

第一步,添加依賴
創建一個新的工程,在app/build.gradle中的dependencies閉包添加以下內容:

implementation 'com.android.support:appcompat-v7:29.0.0'
注意這里的『29.0.0』要和你的 compileSdkVersion 版本號一致。版本號是28,就改為28。

別的不需要改,以下是此時的項目目錄以及gradle文件內容

第二步,創建RecyclerView布局
在你的布局文件中添加RecyclerView,切記要為RecyclerView添加id。

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

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_card"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</RelativeLayout>

第三步,為RecyclerView中的item創建一個統一的布局文件
在layout下創建一個名為layout_rv_card的布局文件,文件名命名要和你的實際業務相匹配方便後期查找。

在此布局文件中,可以添加任何你想展示的視圖,在這里我們先創建兩個TextView為大家展示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:orientation="horizontal">

<TextView
android:id="@+id/tv_id"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center" />

<TextView
android:id="@+id/tv_state"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center" />
</LinearLayout>

別忘了添加id。

第四步,創建Adapter
Adapter是連接後端數據和前端顯示的適配器介面,是數據和UI(View)之間一個重要的紐帶。

如果之前沒有接觸過,先跟著做,做完之後就會理解了。

我們在項目目錄下新建一個java類,取名為CardAdapter。

然後在CardAdapter中我們創建一個內部類MyViewHolder繼承RecyclerView.ViewHolder。

為什麼要創建內部類?

答:就是為了方便而已,創建在外部也是可以,但是如果項目大了之後,類太多不好區分,而且基本上因為布局的不同ViewHolder也基本不同,不會復用,所以創建在內部即可。

為什麼要使用ViewHolder?

答:ViewHolder的主要任務:容納View視圖。前邊我們提到Adapter連接了後端數據和前端顯示,viewHolder的作用就是提供前端的視圖文件。

接下來,我們在ViewHolder綁定視圖文件,同在activity中類似,itemView顧名思義即列表中每一項的視圖,每一項都要綁定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
* @Author: Messi Mei
* @Date: 2020/8/24 13:46
* @Email: [email protected]
**/
public class CardAdapter {

class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tvId,tvState;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tvId = itemView.findViewById(R.id.tv_id);
tvState = itemView.findViewById(R.id.tv_state);
}
}
}
第五步,完成Adapter
在我們創建的CardAdapter類繼承我們創建的內部類MyViewHolder,並重寫提供的三個方法:

onCreateViewHolder(),onBindViewHolder(),getItemCount()

import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
* @Author: Messi Mei
* @Date: 2020/8/24 13:46
* @Email: [email protected]
**/
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.MyViewHolder> {

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

}

@Override
public int getItemCount() {
return 0;
}

class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tvId,tvState;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tvId = itemView.findViewById(R.id.tv_id);
tvState = itemView.findViewById(R.id.tv_state);
}
}
}

5.1重寫onCreateViewHolder方法,返回我們的內部類MyViewHolder ,此處為將我們的item布局文件和adapter綁定。

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.layout_rv_card,parent,false);
return new MyViewHolder(view);
}

也可以寫為

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_rv_card,parent,false);
return new MyViewHolder(view);
}
一樣的。

5.2為每一項視圖,添加數據。

此處holder為你每一項的MyViewHolder對象,position 定位,可以理解為list下標。

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.tvId.setText(position);
holder.tvState.setText(position+position);
}
5.3返回列表大小

@Override
public int getItemCount() {
return 0;
}
第六步,創建數據介面
創建一個List列表(當然也可以是JsonArray),以此為例,我們創一個Card實體類,為List添加該類泛型。

6.1接下來在CardAdapter創建一個帶該list的構造器

List<Card> list;

public CardAdapter(List<Card> list) {
this.list = list;
}
6.2在getItemCount方法中返回該列表大小

@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
6.3在onBindViewHolder方法中綁定真實數據

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.tvId.setText(list.get(position).getId());
holder.tvState.setText(list.get(position).getState());
}
以下為整體代碼(文末有我在使用RecycleView中對Adapter的改進代碼,如有需要可以參考):

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

/** @Author: Messi Mei @Date: 2020/8/24 13:46 @Email: [email protected] */
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.MyViewHolder> {
private List<Card> list;

public CardAdapter(List<Card> list) {
this.list = list;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_rv_card, parent, false);
return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.tvId.setText(list.get(position).getId());
holder.tvState.setText(list.get(position).getState());
}

@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}

static class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tvId, tvState;

MyViewHolder(@NonNull View itemView) {
super(itemView);
tvId = itemView.findViewById(R.id.tv_id);
tvState = itemView.findViewById(R.id.tv_state);
}
}
}

第七步,使用RecycleView
在Activity中創建RecycleView對象並綁定視圖,創建Adapter對象。

在initData中初始化數據。

package com.mz.myapplication;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private CardAdapter cardAdapter;
private List<Card> list;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}

private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 50; i++) {
Card card = new Card();
card.setId(i+1+"");
if (i%2 == 1){
card.setState("在線");
}else{
card.setState("離線");
}
list.add(card);
}
}

private void initView() {
recyclerView = findViewById(R.id.rv_card);
cardAdapter = new CardAdapter(list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(cardAdapter);
}
}

至此,運行即可。

如果你想要更復雜的列表布局,在布局文件中加入相應的視圖即可,修改完後記得在ViewHolder中加入、綁定相應的視圖,在Adapter中的onBindViewHolder為其添加、綁定數據。

3. android 怎麼在外面拿recyclerview 中viewholder的控制項

據官方的介紹,該控制項用於在有限的窗口中展示大量數據集,其實這樣功能的控制項我們並不陌生,例如:ListView、GridView。
那麼有了ListView、GridView為什麼還需要RecyclerView這樣的控制項呢?整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。
你想要控制其顯示的方式,請通過布局管理器LayoutManager
你想要控制Item間的間隔(可繪制),請通過ItemDecoration
你想要控制Item增刪的動畫,請通過ItemAnimator
你想要控制點擊、長按事件,請自己寫(擦,這點尼瑪。)
基本使用
鑒於我們對於ListView的使用特別的熟悉,對比下RecyclerView的使用代碼:
mRecyclerView = findView(R.id.id_recyclerview);
//設置布局管理器
mRecyclerView.setLayoutManager(layout);
//設置adapter
mRecyclerView.setAdapter(adapter)
//設置Item增加、移除動畫
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割線
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST));12345678910

ok,相比較於ListView的代碼,ListView可能只需要去設置一個adapter就能正常使用了。而RecyclerView基本需要上面一系列的步驟,那麼為什麼會添加這么多的步驟呢?
那麼就必須解釋下RecyclerView的這個名字了,從它類名上看,RecyclerView代表的意義是,我只管Recycler View,也就是說RecyclerView只管回收與復用View,其他的你可以自己去設置。可以看出其高度的解耦,給予你充分的定製自由(所以你才可以輕松的通過這個控制項實現ListView,GirdView,瀑布流等效果)。

附上出處鏈接:http://blog.csdn.net/lmj623565791/article/details/45059587

4. android view怎麼回收

切換Layout的話,你的Activity將長駐內存,也就是說你的應用中該Activity始終都是存在的,調用另外一個Activity的話,上一個Activity實例就會被銷毀和回收掉的.如果不想在程序中讓Activity數量過多,你可以考慮用Layout方式.

5. Android-ViewPager2

ViewPager2

簡單說就是將RecycleView再封裝了一遍,然後協同FragmentStateAdapter將RecycleView的每個Item與Fragment綁定。

特性

支持從左到右,或者從上到下布局

由於適配基於的是RecyclerView.Adapter,所以內存優化也直接採用RecyclerView.Adapter的內存優化機制,相對於viewpager,內存優化更高效合理,且notifyDataSetChanged也更高效了。由於不用開發者自己實現內存和notifyDataSetChanged,也更簡便了。 

相比ViewPager,ViewPager2修復了不能關閉預載入和更新Adapter不生效的痛點。

目前ViewPager2對Fragment支持只能用FragmentStateAdapter,FragmentStateAdapter在遇到預載入時,只會創建Fragment對象,不會把Fragment真正的加入到布局中,所以自帶懶載入效果。

FragmentStateAdapter不會一直保留Fragment實例,回收的ItemView也會移除Fragment,所以得做好Fragment重建後恢復數據的准備。

FragmentStateAdapter在遇到offscreenPageLimit>0時,處理離屏Fragment和可見Fragment沒有什麼區別,所以無法通過setUserVisibleHint判斷顯示與否。

基本方法

部分核心方法使用參照RecycleView和ViewPager,如設置分割線addItemDecoration(),設置當前項setCurrentItem()等。

setAdapter() 設置適配器

setOrientation() 設置布局方向

setCurrentItem() 設置當前Item下標

beginFakeDrag() 開始模擬拖拽

fakeDragBy() 模擬拖拽中

endFakeDrag() 模擬拖拽結束

setUserInputEnabled() 設置是否允許用戶輸入/觸摸

setOffscreenPageLimit()設置屏幕外載入頁面數量

registerOnPageChangeCallback() 注冊頁面改變回調

setPageTransformer() 設置頁面滑動時的變換效果

。。。還有好多。使用的時候大家可以具體看一下。

offscreenPageLimit()

不設置它則不會預載入,一旦設置了,由於limit必須>0,所以會進行預載入limit個頁面

viewpager2的預載入在載入時已經准備好了View布局,但是沒有載入到parent視圖上,所以自帶懶載入效果。 而viewpager載入的時候View已經添加到parent上。所以會走生命周期的方法。

從 初始化 方法可以看出,viewpager2支持的一些特性以及為什麼。

RecyclerViewImpl

基於RecyclerView的二次封裝,對觸摸事件,初始化等進行封裝。

LinearLayoutManagerImpl

使用LinearLayoutManager,所以擁有LinearLayoutManager的特性,可以垂直或者水平。也就引申出為什麼後面可以設置水平或者垂直滑動

PageTransformerAdapter

用於監聽pager的改變。

基於 RecyclerView.Adapter實現

類似recycleView的使用。

基於FragmentStateAdapter實現

6. Android RecycleView滾動監聽,以及view回收的細節

主要細節是,如果要在recycleView在回收的同時,做UI調整容易出現的問題。
一、xml可見的最外層設置為margin,view的回收還有添加的時間點可能不好計算,容易出現卡頓的情況,
二、如果是實用方法smoothScrollBy,第一個view剛好滾出可視區的時候是沒有被回收的,技巧就是滾動距離加1
沒圖沒真相,以下是業務需求的效果

首先想法是通過behavior解決問題,但是後來發現behavior需要好多個,各種相互觀察好麻煩,所以想一下可不可以直接使用RecycleView,通過滾動監聽改變圖片大小實現功能,初步想法是第一個可視view不斷變小,第二個可視的view不斷變大,如下圖

滾動的初步想法是這樣的通過滾動距離dx,來改變view的大小

但是後來發現dx,效果不行,有興趣的同學自己試一下,所以想了另外一個思路,根據下標為2的view也就是第三本書的位置,修改前面兩本書的寬度,所以不需要dx了,這里順便提一下,書本這個view是重寫了ImageView的,把寬高比固定為3:4,所以只需要不斷的改變書本的寬度就好了,其中bookWidth 為小書本的原始高度

到這里基本上就實現了滾動效果了,但是業務需求是當手指不在滑動的時候,不允許書本被覆蓋的,所以這里就要,監聽滾動狀態

這個地方必須使用smoothScrollBy,不能是ScrollBy,因為ScrollBy不會回調onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy)這個方法,造成view寬度沒有重新設定。
項目地址: https://gitee.com/feng87/BookShelf

7. android getview什麼時候調用

舉個例子吧:當系統 要顯示一個gridview,gridview里有10個子元素,但界面只夠顯示5個,其它五個是你滾動的時候才出現。現如今顯示了這個gridview,你怎麼知道它顯示的是哪五個呢,這個時候是不是要position你有了position還不夠啊,你還得控制顯示它,比如現在顯示的是4,5,6,7,8這五個你得更新顯示這五個元素的uiandroid系統為了省內存,它會把第1,2,3 new出來的view傳給你問你是不是要復用,這就是那個參數view的用途,如果你復用它,就將它返回(返回之前需重新設置這個view里的值如:更新view里的textView的顯示等)。所以你會在getView里經常看到:if(vew=null){view=......}return view;

8. android開發 BaseAdapter的convertView參數是什麼意思

這個convertView其實就是最關鍵的部分 原理上講 當ListView滑動的過程中 會有item被滑出屏幕 而不再被使用 這時候Android會回收這個條目的view 這個view也就是這里的convertView

當item1被移除屏幕的時候 我們會重新new一個View給新顯示的item_new 而如果使用了這個convertView 我們其實可以復用它 這樣就省去了new View的大量開銷

public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView != null) {
view = convertView;
//復用了回收的view 只需要直接作內容填充的修改就好了
} else {
view = new Xxx(...);
//沒有供復用的view 按一般的做法新建view
}
return view;
}

9. Android 怎麼隱藏控制項,又不回收控制項的空間

在Android開發中,大部分控制項都有visibility這個屬性,其屬性有3個分別為「visible 」、「invisible」、「gone」。主要用來設置控制控制項的顯示和隱藏。有些人可能會疑惑Invisible和gone是有什麼區別的???

其在XML文件和Java代碼中設置如下:

可見(visible)
XML文件:android:visibility="visible"
Java代碼:view.setVisibility(View.VISIBLE);

不可見(invisible)
XML文件:android:visibility="invisible"
Java代碼:view.setVisibility(View.INVISIBLE);

隱藏(GONE)
XML文件:android:visibility="gone"
Java代碼:view.setVisibility(View.GONE);

VISIBLE:設置控制項可見
INVISIBLE:設置控制項不可見
GONE:設置控制項隱藏

而INVISIBLE和GONE的主要區別是:當控制項visibility屬性為INVISIBLE時,界面保留了view控制項所佔有的空間;而控制項屬性為GONE時,界面則不保留view控制項所佔有的空間。

http://blog.csdn.net/chindroid/article/details/8000713

10. android 自定義view怎麼做能提高效率

越少越好

為了加速視圖,從那些調用頻繁的活動中減少不必要的代碼。在OnDraw()方法中開始繪制,它會給你最大的
效益。特別低,你也應該減少在onDraw()方法中的內存分配,因為任何內存分配都可能導致內存回收,這將會

引起不連貫。 在初始化或者動畫之間分配對象。絕不要在動畫運行時分配內存。

另一方面需要減少onDraw()方法中的開銷,只在需要時才調用onDraw()方法。通常invalidate()方法會調用

onDraw()方法,因此減少對invalidate()的不必要調用。如果可能,調用它的重載版本即帶有參數的invalidate()

方法而不是無參的invalidate()方法。該帶參數的方法invalidate()能使draw過程更有效,以及減少對落在該矩形

區域(參數指定的區域)外視圖的不必要重繪 。

閱讀全文

與androidview回收相關的資料

熱點內容
弗洛伊德演算法c 瀏覽:6
udp命令字 瀏覽:659
app服務端java源碼 瀏覽:798
電腦用文件夾玩大型游戲 瀏覽:254
安卓耳塞失靈怎麼辦 瀏覽:765
華三交換機保存命令 瀏覽:605
命令方塊怎麼調鍵盤 瀏覽:841
不把密碼存在伺服器上怎麼辦 瀏覽:398
怎麼讓指令方塊的命令消失 瀏覽:543
用單片機做plc 瀏覽:404
雲伺服器進入子目錄命令 瀏覽:795
伺服器機櫃如何配電 瀏覽:578
怎麼刪除iphone資源庫里的app 瀏覽:940
pdf魚 瀏覽:648
單片機pcf8591什麼作用 瀏覽:805
sql命令學院 瀏覽:283
加密軟體在電腦那個盤 瀏覽:988
android獲取外部存儲 瀏覽:573
怎麼查自己家的伺服器地址 瀏覽:858
編程c語言工作好不好 瀏覽:569