0

ある顧客から、タスクキラーでアプリを強制終了した後、起動時にアプリが終了するというフィードバックが届きました。AndroidはRAMをWindowsとして管理しないため、タスクキラーは危険であり、電話のパフォーマンスに何の影響も与えないと彼に話しましたが、彼はタスクキラーをアンインストールしません。

フォースクローズは次のようになります。

A)ユーザーは私のアプリを通常どおり使用しています

B)ユーザータスクが私のアプリを強制終了します

C)ユーザーがアプリを再度起動する

D)起動時に強制終了

E)ユーザーがアプリをもう一度起動する

F)すべてが意図したとおりに機能する

問題は、静的オブジェクトがRAMからクリアされたためにヌルになり、アプリを強制的に閉じるNullPointerExceptionsが発生することです。ただし、これらの静的オブジェクトにアクセスしている場所はたくさんあるので(そうでない場合は、静的オブジェクトも使用しません)、NullPointerExceptionsが多くの場所で発生する可能性があります。

この動作は、Android2.3.7以下でのみ発生します。Android 4.0独自のタスクキラー(ホームを長押しすることでアクセスできるタスクキラー)は、アプリを正しく強制終了してから、強制的に閉じることなくアプリを起動します。

この動作を回避するにはどうすればよいですか?

4

1 に答える 1

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そのため、 null でない場合はすぐに呼び出され、メイン スレッドでreturnStatic(whatever)アクセスできます。whateverそれ以外の場合は、ネットワークから自動的にロードし、 returnStatic(whatever)ロードされたときにメインスレッドから呼び出します。

于 2013-02-01T12:37:41.693 に答える