私はユーザーの場所(MyLocationクラス)を検索する機能を持っています。ジオポイントを使用するかどうかは、AsyncTaskを実行してサーバーに接続し、サーバーのリストを取得します。リストが準備ができたら、ArrayList都市に保存します。 cities ArrayListがいっぱいになると、それが良い(構成の変更を証明する)ために保存されたいと思います。 CityItemはParcelableを実装しています。私はそれらをonSaveInstanceStateに保存し、それらをonCreateで取得します。設定変更後に変数への参照が失われました
これで、タスクが完了して都市リストがいっぱいになるとすべて正常に機能します。次に、デバイスを前後に回転させ、Log.i( "StartActivity"、 "都市リストをダウンロード:" cities.toString());呼び出される。
しかし、私はデバイスを回転させた場合geopointが見つかった前(またはタスク終了 - それは速く起こるので伝えるのは難しい)、その後、
public void gotCities(ArrayList<CityItem> _cities){
cities = _cities;
Log.i("StartActivity", "gotCities("+cities.size()+"): "+cities.toString());
}
が呼び出されます(と都市は完全に罰金ですログに)しかし、私はもう一度それを回転させるときArrayList都市は再びのように見えます。
設定が変更され、savedInstanceState.citiesがnullの場合、ArrayList都市は何とか再作成され、getCities()関数のものと同じArrayListではないようです。
私はそれが何か簡単だと確信していますが、私は何時間も答えを探していました。私はそれをやり遂げることはできません。
活動のコード:
public class StartActivity extends Activity {
public static final String PREFS_NAME = "PrefsFile";
MyLocation myLocationObject = null;
LatLngPoint point = null;
ArrayList<CityItem> cities = null;
FindCityTask task = null;
Activity startActivity;
@Override
public void onCreate(Bundle savedInstanceState) {
if(savedInstanceState!=null) if(savedInstanceState.containsKey("cities")) cities = savedInstanceState.getParcelableArrayList("cities"); if(cities!=null) Log.i("Cities retrieved", cities.toString());
super.onCreate(savedInstanceState);
startActivity = this;
setContentView(R.layout.start);
//check if the configuration (orientation) has been changed
NonConfigurationObject nco = (NonConfigurationObject)getLastNonConfigurationInstance();
if(nco!=null) if(nco.myLocationObject!=null) myLocationObject = nco.myLocationObject;
if(nco!=null) if(nco.task!=null) task = nco.task;
if(cities==null){
Log.i("StartActivity", "Cities list is empty - retrieve them.");
if(myLocationObject==null){
getGeopoint();
}
} else {
Log.i("StartActivity", "Cities list downloaded:"+cities.toString());
}
}
private void getGeopoint(){
if(isOnline()){ //there is internet connection
if(myLocationObject==null){
myLocationObject = new MyLocation();
//calls function to check user location (returns false if no providers are enabled
if(!myLocationObject.getLocation(this, locationResult)){ /*TODO handle */Log.i("StartActivity", "Location providers disabled");}
}
} else { //not online - show msg
Log.i("StartActivity", "No internet connection");
}
}
//waits for user geopoint. then starts FindCityTask
LocationResult locationResult = new LocationResult(){
@Override
public void gotLocation(final Location location){
if(location!=null){
// location found
Log.i("StartActivity", "Received location: "+location.toString());
point = new LatLngPoint((float)location.getLatitude(), (float)location.getLongitude());
} else {
// location not found
Log.i("StartActivity", "No location received after 20 seconds");
point = null;
}
//RUN TASK to connect to server to get cities list (even if there's no geopoint)
task = new FindCityTask(startActivity);
task.execute(point);
}
};
public void gotCities(ArrayList<CityItem> _cities){
cities = _cities;
Log.i("StartActivity", "gotCities("+cities.size()+"): "+cities.toString());
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Log.i("onSaveInstanceState", "onSaveInstanceState");
if(cities!=null) savedInstanceState.putParcelableArrayList("cities", cities);
}
@Override
public NonConfigurationObject onRetainNonConfigurationInstance() {
NonConfigurationObject nco = new NonConfigurationObject();
if(myLocationObject!=null){
nco.myLocationObject = myLocationObject;
}
if(task!=null){
nco.task = task;
}
return nco;
}
static class NonConfigurationObject{
MyLocation myLocationObject;
FindCityTask task;
}
gotCities()メソッドは、AsyncTask onPostExecuteから呼び出される:方位cnangeがヒットすると、あなたの活動は、停止して破壊され、新たに作成され
@Override
protected void onPostExecute(Void result) {
if(this.activity!=null){
((StartActivity) activity).gotCities(cities);
}
}
は、しかし、私はonSaveInstanceStateからのコールバックを持っています。位置の取得はTimerTaskに移動されます(MyLocationはこれを処理し、geopointをlocationResultに送信します)。私はちょうど1秒前に解決策を見つけましたが、大丈夫かどうか疑問に思います。 –
静的フィールドはOKです。アプリのJVMと同じくらい長く存続し、アクティビティのライフサイクルの影響を受けません。 –
ありがとうございます。しかし、私はまだ何かが欠けていると感じています。都市の変数が単に漏れてしまったのではないかと心配しています。私はどこでそれを起こさせたのだろうか。 –