2013-02-01 59 views
0

有一位客戶向我發送了關於我的應用程序部隊在啓動後關閉的反饋,因爲他用任務殺手殺死了應用程序。我告訴他任務殺手是危險的,對手機性能沒有任何好處,因爲Android不會將RAM作爲Windows管理,但他不會卸載Task Killer。任務完成後開始強制關閉開始應用程序

力閉合是這樣的:

A)用戶使用我的應用程序通常

B)的用戶任務殺死我的應用程序

C)用戶啓動我的應用程序再次

d)啓動時關閉力

E)用戶再次啓動我的應用程序

F)一切按預期工作

我發現問題是我的靜態對象變爲空,因爲它們從內存中清除,導致強制關閉應用程序的NullPointerExceptions。但是,我有很多地方訪問這些靜態對象(如果這不是我不會使用靜態對象的情況),所以NullPointerExceptions可能發生在很多地方。

此行爲僅發生在Android 2.3.7或更低版​​本中。 Android 4.0自己的任務殺手(您可以通過長時間的Home訪問)殺死應用程序,然後在沒有任何關閉的情況下啓動應用程序。

我該如何規避這種行爲?

+0

把你的應用程序日誌和啓動代碼。 –

+0

他沒有提交日誌,但基本上應用程序試圖啓動它被暫停的地方,並且每當它試圖獲得一個靜態對象時,NPE就會關閉。 主要的問題是異常不會在同一個地方被捕獲:它引發你訪問的最後一個Activity,使得異常處理更加麻煩。 – razielsarafan

+0

你有你的應用程序代碼?嘗試在您的位置執行相同的步驟,通過Log.e或Log.d獲取日誌,然後將其發佈到此處。也放一些代碼,否則沒有人可以幫助你。 –

回答

0

我解決了它。

解決的辦法是不是最佳的,但它的工作原理:

我創造了這樣一個接口:

public interface StaticAccessTo<T>{ 
    public void returnStatic(T object); 
} 

而不必爲我的靜態對象吸氣的,我有這樣的:

public void getWhatever(StaticAccessTo<Whatever> callback){ 
    if (whatever == null){ 
     loadWhateverFromServer(callback); 
    } else { 
     callback.returnStatic(whatever); 
    } 
} 

private void loadWhateverFromServer(StaticAccessTo<Whatever> callback){ 
    new AsyncTask<Void,Void,Void>(){ 

    public Void doInBackground(Void... params){ 
     whatever = loadWhatever(); 
     return null; 
    } 

    public void onPostExecute(Void result){ 
     callback.returnStatic(whatever); 
    } 

    }.execute(); 
} 

因此,如果whatever不爲空,它將立即調用returnStatic(whatever),並將在主線程中訪問whatever。否則,它將自動從網絡加載它,並在加載時從主線程調用returnStatic(whatever)