1. 程式人生 > >Android學習中遇到的問題及解決方案

Android學習中遇到的問題及解決方案

1.搭建開發環境時遇到的問題

初裝Android Studio,首次執行報錯:Error running app: Instant Run requires ‘Tools | Android | Enable ADB integration’ to be enabled.
解決方案
根據提示,勾選Tools | Android | Enable ADB integration
ADB(Android Debug Bridge),起到除錯橋的作用。ADB採用監聽Socket TCP 5554等埠的方式讓IDE和Qemu通訊。ADB是android SDK裡的一個工具, 可以直接操作管理android裝置。
其主要功能:
* 執行裝置的shell(命令列)
* 管理模擬器或裝置的埠對映
* 計算機和裝置之間上傳/下載檔案
* 將本地apk軟體安裝至模擬器或android裝置

2.執行時遇到無法例項化Activity的錯誤

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
java.lang.NullPointerException:Attempt to invoke virtual method ‘android.view.Window$Callback android.view.Window.getCallback()’ on a null object reference
錯誤原因以及解決方案
經Google得到的回答:An Activity is not fully initialized and ready to look up views until after setContentView(…) is called in onCreate().
      setContentView(R.layout.activity_main)表示設定當前Activity採用R.layout下的activity_main佈局檔案進行佈局。當activity 呼叫 setContentView() 時,android 才會去繪製 layout 上的各個元素,併為其分配記憶體。只有分配了記憶體以後,才能繼續執行findViewById(),才能得到引用,不然得到空引用,即意味著,後面使用相應變數時就會發生訪問的物件不存在的問題。當Activity重新setContentView()以後,那些之前繪製的控制元件的記憶體都被滅掉了。故需注意,若是通過setContentView 來達到畫面切換目的的,重新繪製後要重新取得引用。
      總之,沒有setContentView(第二個介面)之前,第二個介面裡的元素雖然能找到,AS沒有報錯,但因沒被分配記憶體,所以在onCreate這裡為第二個介面繫結監聽是錯誤的!執行的時候程式會直接掛掉。
      記住

:setContentView之後才為佈局裡的元素分配記憶體,在未分配記憶體前對元素進行訪問時沒有意義的!

3.Activity跳轉後佈局介面空白

在Activity介面編輯程式碼時,打出onCreate隨手回車,setContentView之後卻無法顯示佈局介面,出現空白介面。
錯誤原因以及解決方案
使用了以下onCreate方法

@Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }

PersistableBundle:A mapping from String values to various types that can be saved to persistent and later restored.即PersistableBundle是一個可以持久儲存並且可以恢復的Bundle.
錯誤檢查方法:可以在onCreate中採用Log.i();列印資訊,進行除錯。以上的onCreate方法只有一些突發異常情況才會觸發它們,比如橫豎屏切換、按Home鍵等。

關於過載的onCreate函式:

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}
  1. super.onCreate(savedInstanceState)是指呼叫父類的onCreate建構函式。
  2. savedInstanceState引數是儲存當前Activity的狀態資訊。當一個Activity的生命週期結束前,會呼叫該方法儲存狀態。
  3. Bundle型別的資料與Map型別的資料相似,以key-value的形式儲存資料。
  4. saveInsanceState引數是指儲存例項狀態即儲存Activity(活動)的狀態。
@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onRestoreInstanceState(savedInstanceState, persistentState);
}
@Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }

三種方法結合使用並在註冊該Activity時候新增屬性android:persistableMode=”persistAcrossReboots”,這樣就可以給你的Activity儲存一些持久化資料。當你的手機重啟或者發生其他意外情況的時候,也可以給你的頁面獲取到相關資料。

4.更新後發生的那些事兒

今天更新完Android Studio開啟以前Gradle為2.10的Project時發現瞭如下錯誤:
error
具體的問題沒有調查清楚,不過倒是找到了解決辦法。
問題的原因個人認為是Gradle沒有自動更新,應該隨便改個版本都行,我的Android Studio改完之後會提示讓我把Gradle更新到2.2.2,然後就好了。
解決的辦法:
可以暫時的將Gradle降為2.14.1 就可以了
File->Project Structure->Project,儲存,更新。

5.Socket deconnection

以前一直沒仔細看Logcat,今天除錯學習的時候突然發現Logcat中輸出了好多條Socket deconnection,頭一回見到deconnection這個單詞,查了下Collins,尷尬的是沒發現這個詞。。。於是根據字首de加第六感,應該是埠斷開了,於是看了下工作管理員,發現有三個adb.exe程序,均來自android sdk.原來是Genymotion和Android Studio共用了一個sdk,解決的方法就是:不要讓他們共用一個sdk.

6.Menu items should specify a title

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:android="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context="com.ryan.game.MainActivity" >
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_setting"/>
</menu>

從Stackflow上找的解決方案:

try to follow Goolge dev examples here http://developer.android.com/guide/topics/ui/menus.html
on the google dev examples they changed the android:showAsAction to app:showAsAction

<?xml version="1.0" encoding="utf-8"?>
<menu 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"
      tools:context="com.ryan.game.MainActivity" >
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never"
        android:title="@string/action_setting"/>
</menu>