2016-08-05 8 views
0

私はカスタムCommerceObjectsのArrayListを作成するSplashActivityを持っています。このリストは、他のアクティビティやフラグメントで、アプリケーションの残りの部分で使用されます。問題は、アプリケーションが停止してから再起動したときに、オブジェクトリストが初期化されていないと表示されることがあることです。解決策は、ArrayListがnullでないかどうかをチェックし、nullの場合はSplashActivityの起動を強制して、ArrayListを再作成することです。私は残りのアクティビティでonRestartメソッドでこれを実行しようとしましたが、まったく動作しません。SplashActivityを強制的に起動して別のアクティビティを再開する

たとえば、これは、SplashActivityで作成されたArrayListがnullの場合、MainActivityをチェックする方法です。

public class MainActivity extends AppCompatActivity { 
    ... 

    @Override 
    protected void onRestart() { 
     // If the full list of commerces is null or is empty, launch the SplashActivity. 
     // Here check if the ArrayList of CommerceObjects is null 
     if (SplashActivity._commerces == null || SplashActivity._commerces.size() == 0) { 
      Intent mIntent = new Intent(MainActivity.this, SplashActivity.class); 
      startActivity(mIntent); 
      this.finish(); 
     } 

     super.onRestart(); 
    } 

    ... 
} 

ので、チェックする配列リストは "_commerces" です。 SplashActivityのpublic staticとしてデコレーションされたです。私はヌルでないかどうかを確認する必要があります。

私が紛失していることはありますか?

答えて

1

UPDATE

私はあなたがonStart()を使用することをお勧めします。 onRestart()は、AppプロセスがAndroid OSによって強制終了された場合は呼び出されません。 https://developer.android.com/reference/android/app/Activity.html

ORIGINAL

静的変数は、Android OSによって初期化されます。
参照:static variable null when returning to the app

静的変数の使用を避けることをおすすめします。 Applicationクラスを作成し、ApplicationインスタンスにCommerceObjectsを保持します。

以下のコードについて説明します。

お使いのApplicationクラス:あなたのAndroidManifest.xmlでアプリケーションの

public class App extends Application { 

    private CommerceObjects mCommerces; 

    public void setCommerces(CommerceObjects commerces) { 
     mCommerces = commerces; 
    } 

    public CommerceObjects getCommerces() { 
     return mCommerces; 
    } 

    public static App get(Context context) { 
     return (App) context.getApplicationContext(); 
    } 
} 

セット名:

<application 
     ... 
     android:name=".App"> 

    ... 

</application> 

初期あなたSplashActivityでcommerces:葯で

public class SplashActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 

     initializeCommerces(); 
    } 

    private void initializeCommerces() { 
     //do initialize tasks 
     ... 
     CommerceObjects commerces = ...; 

     //set CommerceObjects to App 
     App.get(this).setCommerces(commerces); 

     //start other Activity. ex) MainActivity 
    } 
} 

使用commercesアクティビティ:

public class MainActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //use CommerceObjects 
     CommerceObjects commerces = App.get(this).getCommerces(); 
     ... 
    } 
} 
+0

お時間を作ってください。これは問題の良いアプローチです。しかし、私は本当にSplashActivityを強制的に再起動する必要があります。 SplashActivityは、サーバーの状態とデータのバージョンをチェックして、別のバージョンのデータがあるかどうかを確認し、ダウンロードして、CommerceObjectのArrayListをリメイクするなど)を行います。 – flagg327

+0

Mmm、あなたの問題は何ですか? onRestartでSplashActivityを起動できませんか? – nshmura

+0

いいえ、アプリケーションを再開し、ArrayListを使用して何かを行う必要がある場合は、クラッシュして古典的なjava.lang.NullPointerExceptionをスローします。仮想メソッド 'int java.util.ArrayList.size()'をnull ArrayListが初期化されていないときに表示されるオブジェクト参照。 – flagg327

関連する問題