Android開發(fā) 常見問題

一.集合賦值問題

一般我們從服務(wù)器請求到集合時一般賦值這樣,然后將數(shù)據(jù)展示到相應(yīng)的控件上。

ArrayList<String> mDataList = new ArrayList<String>();

    public void getRespon(ArrayList<String> mServiceDataList) {
        mDataList = mServiceDataList;

    }

這樣直接操作數(shù)據(jù)源,會導(dǎo)致當(dāng)我們把mDataList集合清空的時候數(shù)據(jù)源mServiceDataList也同時清空,破壞了源數(shù)據(jù),因為兩個指向的是一個地址。因此不應(yīng)該直接操作數(shù)據(jù)源。

 ArrayList<String> mDataList = new ArrayList<String>();

    public void getRespon(ArrayList<String> mServiceDataList) {
        //1.清空下集合
        mDataList.clear();
        //2.添加集合
        if (mServiceDataList != null) {
            mDataList.addAll(mServiceDataList);
        }
    }

為了避免產(chǎn)生莫名其妙的問題,因此盡量不要破壞傳過來的數(shù)據(jù)。

二.switch 不止可以判斷 int

從 Java JDK 1.7 開始,switch 語句就可以開始支持判斷 string 對象 和 enum 枚舉

 public void localEquals(String testString) {
        switch (testString) {
            case "測試一":
                break;
            case "測試二":
                break;
            case "測試三":
                break;
        }
    }

三. equals方法使用防止空指針

string 中 equals方法可以比較兩個內(nèi)容是否相等

 public void testEquals(String  testString){
       "hello".equals(testString);
   }

如果testString 寫在前面

 public void testEquals(String  testString){
       if(testString!=null){
           testString.equals("hello");
       }
   }

第一個方法不用非空判斷,而且testString可以為空值。

四. 被 final 修飾的對象不能被修改

我們常常誤以為,被 final 修飾對象不能被修改,其實這種說法不是完全正確的。修改這個對象的成員變量是沒有任何問題的

 public void testFinal() {
        final ReportAllBean mReportAllBean=new ReportAllBean();
        mReportAllBean.data="測試修改";
    }

但是不能對這個對象進行重新賦值


image.png

五.Java 子父類相互轉(zhuǎn)換

子類轉(zhuǎn)父類
  public void testView() {
        TextView mTextView = new TextView(mActivity);
        View mTextView1 = mTextView;
        mTextView1.setVisibility(View.VISIBLE);

    }

TextView可以轉(zhuǎn)成父類。并且調(diào)用setVisibility方法

父類轉(zhuǎn)子類
 public void testView() {
        View mView = new View(mActivity);
        TextView mTextView = (TextView) mView;

    }

運行報ClassCastException
但是findViewById好像返回的就是一個View并且可以轉(zhuǎn)換成子類類型

public void testView() {
        View viewById = mActivity.findViewById(R.id.viewPager);
        ViewPager mViewPager = (ViewPager) viewById;
    }

雖然 findViewById 可以強轉(zhuǎn)成 View 的子類,但是本質(zhì)獲取到的還是 XML 中的那個類型 View,XML 中是 ViewPager,findViewById 獲取到也只能是 ViewPager,如果強轉(zhuǎn)成 其他類型 一定會報類型轉(zhuǎn)換異常

父類是可以轉(zhuǎn)成子類的,但是有一個前提條件,那就是它本質(zhì)上就是這個子類的對象

六.基本數(shù)據(jù)類型和對象

image.png

基本數(shù)據(jù)類型和對象之間有很大的區(qū)別,基本數(shù)據(jù)類型只能是一個數(shù)值,而對象可以有變量和方法,int 的默認值為0,而 Integer 的默認值為 null,因為它們本身就是兩種不同的東西

六.重寫和重載

重寫:重寫父類的方法

 @Override
    public void onPause() {
        super.onPause();
    }

重載:一個類里可以有相同方法名的方法,但是參數(shù)不同。

 public void testView() {

    }
 public void  testView(int i) {
    }

七.ListView 或 RecyclerView 使用 Glide

錯誤寫法

Context context = MainActivity.this;

Glide.with(context)
        .load(url)
        .into(imageView);

正確寫法

Glide.with(imageView.getContext())
        .load(url)
        .into(imageView);

Glide 使用的上下文建議用 ImageView.getContext() 的,來源于我曾經(jīng)遇到過的問題,在 RecyclerView 中 itemView 中包含一個 ImageView 對象,用于加載后臺的用戶頭像 URL,但是隨著列表的滾動,ImageView 加載的圖片會混亂起來,原因是 Glide 持有 Activity 的上下文,只要 Activity 沒有 finish,Glide 就不會停止本次讀取和加載,如果使用了 ImageView 的上下文,只要 ImageView 不可見就會停止加載

此篇文章來源于玉剛文章《那些年,那些坑》,再加一部分自己遇到的坑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,685評論 1 32
  • USB模式打開 小米3: 開發(fā)常見問題: Activity全屏,軟鍵盤擋住輸入框問題的終極解決方案: EditTe...
    慢牛策略閱讀 471評論 0 0
  • 1,使用DBMS導(dǎo)入文件時候出現(xiàn)如下提示: [2016-08-30 10:28:35 - ddms] transf...
    拜雨LeoLiu閱讀 215評論 0 0
  • 去年今日此門中,人面桃花相映紅。人面不知何處去,桃花依舊笑春風(fēng)。
    獨沽酒濺閱讀 191評論 0 0
  • 《無問西東》 如果有機會提前了解你的人生,知道青春也不過只有這些日子, 不知是否你還會在意那些世俗要你們在意的事情...
    張雅梅May閱讀 189評論 0 0

友情鏈接更多精彩內(nèi)容