Android常見問題總結(三)

RandyHsu 8年前發布 | 33K 次閱讀 Android開發 移動開發 Android

上一篇博客傳送門:Android常見問題總結(二)

 

 

11. Android的數據存儲形式

在Android中的數據存儲形式主要有以下幾種:

SharedPreferrences

SharedPreferrences主要用于存儲一些少量的簡單的應用程序配置信息。SharedPreferrences以明文鍵值對的形式把數據存儲在一個xml文件上,該文件位于/data/data/<package name>/shared_prefs目錄下。因此,SharedPreferrences只適合用于存儲一些簡單的數據,不適合存儲復雜的或敏感的數據。

 

File

Android和Java一樣,同樣支持使用文件流來保存和訪問文件。除了在手機內置存儲空間上存儲文件外,Android還支持讀寫SD卡上的文件:只要獲取相應的權限后,調用Environment的getExternalStorageDirectory方法即可獲取路徑。

 

SQLite數據庫

Android系統集成了一個輕量級的數據庫:SQLite。SQLite是一個嵌入式數據庫引擎,專門適用于資源有限的設備上適量數據的存取。在Android上我們一般使用SQLiteOpenHelper輔助類來操作SQLite數據庫。

 

12. Sqlite的基本操作

SQLite為熟悉SQL語句的程序員提供了相應的函數使用SQL語句,也為不了解SQL語法的程序員提供了簡便的增刪查改接口:

String path = "數據庫路徑";
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(path, null);
// 執行sql語句
database.execSQL(sql);
// 執行帶占位符的sql語句
database.execSQL(sql, bindArgs);
// 執行查找的sql語句
database.rawQuery(sql, selectionArgs);

// 執行增刪查改
database.insert(table, nullColumnHack, values);
database.delete(table, whereClause, whereArgs);
database.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
database.update(table, values, whereClause, whereArgs);

// 開啟事務
database.beginTransaction();
// 確認事務成功
database.setTransactionSuccessful();
// 結束事務
database.endTransaction();

 

13. Android中的MVC模式

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。

MVC模式的示意圖如下:

 

Android的設計也使用了MVC模式,其中:

  1. View對應于Android的View控件和xml所編寫的界面
  2. Control對應于Android中的Activity,負責接收用戶請求和改變模型狀態
  3. Model一般由我們自己實現來處理程序功能和邏輯

 

14. Merge、ViewStub的作用

Merge和ViewStub均為Android中的xml優化標簽,用于對Android的View布局進行優化。

Merge

merge標簽應用于xml的頂層標簽,主要應對于layout嵌套浪費的現象。在Android layout文件中需要一個頂級容器來容納其他的組件,而不能直接放置多個組件,通過使用merge標簽作為頂層容器,我們可以刪減多余或者額外的層級,從而優化整個Android Layout的結構。

 

以下是一個例子:

activity_merge_test.xml:

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

    <TextView 
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="top|center_horizontal"
        android:text="text_view"/>

    <TextView 
        android:id="@+id/text_view_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom|center_horizontal"
        android:text="text_view_2"/>

</FrameLayout>

 


MergeTestActivity:

public class MergeTestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_merge_test);
    }
}


效果圖如下:

merge效果圖

 

由hierarchyviewer分析可得(此處只分析與Activity界面相關的部分):

hierarchyviewer分析

 

由hierarchyviewer得到的View樹狀圖我們可以發現,id為content的FrameLayout中只有LinearLayout一個元素,造成了layout的嵌套浪費(如紅框圈出所示)。此處我們若使用merge標簽,便可以減少一層layout標簽的嵌套,使程序運行得更快更流暢。

 

xml代碼改為如下:

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

    <TextView 
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="top|center_horizontal"
        android:text="text_view"/>

    <TextView 
        android:id="@+id/text_view_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom|center_horizontal"
        android:text="text_view_2"/>

</merge>


效果圖沒有變化,使用hierarchyviewer分析可得:

hierarchyviewer優化后

此時已經減少了一層layout嵌套,我們通過使用merge標簽,達到了優化的目的。

 

ViewStub

ViewStub即占位符,用于處理動態覺得顯示某個View的情況。在開發應用程序的時候,我們經常會在運行時動態根據條件來決定顯示哪個View或某個布局。那么最通常的想法就是把可能用到的View都寫在上面,先把它們的可見性都設為View.GONE,然后在代碼中動態的更改它的可見性。這樣的做法的優點是邏輯簡單而且控制起來比較靈活。但是它的缺點就是,耗費資源。雖然把View的初始可見View.GONE但是在Inflate布局的時候View仍然會被Inflate,也就是說仍然會創建對象,會被實例化,會被設置屬性。也就是說,會耗費內存等資源。而使用ViewStub的話在inflate布局的時候不會被inflate,ViewStub的inflate操作被延遲到了直到我們調用其inflate方法。

 

ViewStub的xml文件設置如下:

<ViewStub
        android:id="@+id/view_stub"
        android:inflatedId="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout="@layout/view_view_stub" />


其中,inflateId屬性表示ViewStub被inflate后重新被賦予的id值,layout屬性指定了調用inflate方法時inflate的具體布局。

 

找到ViewStub并調用inflate:

ViewStub viewStub = (ViewStub)findViewById(R.id.view_stub);
viewStub.inflate();


值得注意的是:

  1. ViewStub只能Inflate一次,之后ViewStub對象會被置為空。按句話說,某個被ViewStub指定的布局被Inflate后,就不會夠再通過ViewStub來控制它了。
  2.  ViewStub只能用來Inflate一個布局文件,而不是某個具體的View。

 

15. Json有什么優劣勢

JSON,即JavaScript Object Notation,是 一種輕量級的數據交換格式,具有良好的可讀和便于快速編寫的特性。業內主流技術為其提供了完整的解決方案(有點類似于正則表達式 ,獲得了當今大部分語言的支持),從而可以在不同平臺間進行數據交換。JSON采用兼容性很高的文本格式,同時也具備類似于C語言體系的行為。這些特性使JSON成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(一般用于提升網絡傳輸速率)。

 

Json優點:

與傳統的xml相比,Json有一下優點:

  1. 在解碼難度方面,XML的解析得考慮子節點父節點,而Json不需要,解析難度較低
  2. Json數據的體積小
  3.  Json的傳輸速度快于XML

但Json也有它不足之處:

  1. 沒有XML格式這么推廣的深入人心和使用廣泛, 沒有XML那么通用性
  2. 命名空間允許不同上下文中的相同的信息段彼此混合,然而在Json中已經找不到了命名空間

來自: http://blog.csdn.net/superxlcr/article/details/51240786 

 本文由用戶 RandyHsu 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!