私はここで奇妙な状況に陥りましたが、それは偶然に起こりました. 私は現在、地図の断片を表示するために Android v2 用の Google Map API を使用しています。ユーザーが USB モードを切り替えるとアプリがクラッシュすることを除いて、すべて正常に動作しています。
問題は、この場合 onSaveInstanceState() をオーバーライドできないため、一部のオブジェクトを保存できないことです。これはGoogle Maps APIの問題です。Null-Pointer-Exceptionを取得しています。完全な logcat は次のとおりです。
04-27 18:45:10.289: E/AndroidRuntime(19982): FATAL EXCEPTION: main
04-27 18:45:10.289: E/AndroidRuntime(19982): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.octanetech.cortes/com.octanetech.cortes.MapActivity}: java.lang.NullPointerException
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.os.Looper.loop(Looper.java:123)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.app.ActivityThread.main(ActivityThread.java:4627)
04-27 18:45:10.289: E/AndroidRuntime(19982): at java.lang.reflect.Method.invokeNative(Native Method)
04-27 18:45:10.289: E/AndroidRuntime(19982): at java.lang.reflect.Method.invoke(Method.java:521)
04-27 18:45:10.289: E/AndroidRuntime(19982): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
04-27 18:45:10.289: E/AndroidRuntime(19982): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
04-27 18:45:10.289: E/AndroidRuntime(19982): at dalvik.system.NativeStart.main(Native Method)
04-27 18:45:10.289: E/AndroidRuntime(19982): Caused by: java.lang.NullPointerException
04-27 18:45:10.289: E/AndroidRuntime(19982): at com.octanetech.cortes.MapActivity.displayPlaces(MapActivity.java:644)
04-27 18:45:10.289: E/AndroidRuntime(19982): at com.octanetech.cortes.MapActivity.onCreate(MapActivity.java:158)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-27 18:45:10.289: E/AndroidRuntime(19982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-27 18:45:10.289: E/AndroidRuntime(19982): ... 11 more
04-27 18:45:10.309: W/ActivityManager(2466): Force finishing activity com.octanetech.cortes/.MapActivity
マップ アクティビティを再開したときにのみアプリケーションがクラッシュします。それ以外の場合、アプリケーションの残りの部分は正常に動作しています。どんな助けでも大歓迎です。
トリミングされた MapActivity クラスの追加を編集します。
public class MapActivity extends SherlockFragmentActivity implements LocationListener, OnInfoWindowClickListener, SearchView.OnQueryTextListener,
OnMarkerClickListener {
// private final BitmapDescriptor markerBitmap = null;
private GoogleMap mMap;
private CameraPosition cameraPosition;
Location currentLocation;
MapView mapView;
Bitmap beaconImage;
Geocoder geocoder;
private Handler mHandler;
protected Marker marker;
ActionBar actionBar;
private Menu menu;
private boolean menuCreated;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
navigate = new NavigateActivity(this);
context = this;
currentLocation = new Location("asd");
currentLocation.setLatitude(0);
currentLocation.setLongitude(0);
setContentView(R.layout.activity_map);
mMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
SupportMapFragment f = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map));
f.setRetainInstance(true);
mMap.setMyLocationEnabled(true);
mMap.setOnInfoWindowClickListener(this);
mMap.setOnMarkerClickListener(this);
cameraPosition = mMap.getCameraPosition();
geocoder = new Geocoder(this, Locale.getDefault());
displayPlaces();
}
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
this.menu = menu;
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.mapview_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) searchItem.getActionView();
setupSearchView(searchItem);
menuCreated = true;
return true;
}
private void setupSearchView(MenuItem searchItem) {
if (isAlwaysExpanded()) {
mSearchView.setIconifiedByDefault(false);
} else {
searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
}
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
if (searchManager != null) {
}
mSearchView.setOnQueryTextListener(this);
}
public boolean onQueryTextChange(String newText) {
// mStatusView.setText("Query = " + newText);
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.list:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, SearchActivity.class);
intent.removeExtra("search");
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
return true;
case R.id.bookmark:
intent = new Intent(adasd.this, BookmarkActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public boolean onQueryTextSubmit(String query) {
// Extras.createActualDialogueBox(context, "error", url.length()+"");
// getPlaces(url);
Intent intent = new Intent(this, LoadingActivityForPlaces.class);
mBeaconOptionsPoppedUp = false;
intent.putExtra("key", query);
startActivity(intent);
Extras.searched = true;
return false;
}
public boolean onClose() {
return false;
}
protected boolean isAlwaysExpanded() {
return false;
}
@Override
public void onBackPressed() {
// do nothing.
if (mBeaconOptionsPoppedUp) {
mBeaconOptionsPoppedUp = false;
}
}
@Override
public void onResume() {
super.onResume();
displayPlaces();
}
@Override
public void onPause() {
super.onPause();
Extras.activityPaused();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
@Override
public void onSaveInstanceState(Bundle bundle) {
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
}
private void displayPlaces() {
if (!Extras.trialMode) {
// TODO Auto-generated method stub
if (placesMarkers != null) {
removeMarkers(placesMarkers);
}
placesMarkers = new ArrayList<Marker>();
for (GooglePlace i : Extras.googlePlaces) {
Marker m = mMap.addMarker(new MarkerOptions()
.position(i.getPosition()).title(i.getTitle())
.snippet(i.getDescription()));
if (i.equals(Extras.currentGooglePlace)) {
m.showInfoWindow();
}
placesMarkers.add(m);
}
for (GooglePlace i : Extras.cortesPlaces) {
Marker m = mMap.addMarker(new MarkerOptions()
.position(i.getPosition()).title(i.getTitle())
.snippet(i.getDescription()));
if (i.equals(Extras.currentGooglePlace)) {
m.showInfoWindow();
}
placesMarkers.add(m);
}
}
}
}
ここで、Extras は静的オブジェクトを持つクラスです。displayPlaces()関数にアクセスすると、アプリがクラッシュします。Extras.GooglePlacesオブジェクトにアクセスすると、Null -pointer-exceptionがスローされます。他のアクティビティでこのオブジェクトを既に初期化していますが、ユーザーが USB モードを切り替えると、Null が発生するため、null ポインター例外が発生します。