android - 谷歌地图(谷歌地图 Android v2) Activity 在切换 USB 模式时崩溃

标签 android usb google-maps-android-api-2

我在这里陷入了一个奇怪的境地,它是偶然发生的。我目前正在使用 Google Map APIs for Android v2 来显示 map fragment 。一切都运行良好,除了当用户在 USB 模式之间切换时应用程序崩溃。

问题是,我无法保存某些对象,因为在这种情况下我无法覆盖 onSaveInstanceState()。这是一个issue在谷歌地图 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

只有当我恢复 map Activity 时应用程序才会崩溃,否则应用程序的其余部分工作正常。任何帮助将不胜感激。

编辑 添加修剪的 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。我已经在其他一些 Activity 中初始化了这个对象,但是当用户在 USB 模式之间切换时,它得到 Null 并因此出现空指针异常。

最佳答案

代码中的 NullPointerException 不是“Google Maps API 中的问题”

我建议不要使用 static 关键字,除了常量、嵌套类和有时是工厂方法。这包括单例反模式。

您将不得不使用您的应用程序架构。 chopchop 的建议是一个好的开始。您可能想在此处检查我对不相关问题的回答中的一些要点:https://stackoverflow.com/a/16335191/2183804

关于android - 谷歌地图(谷歌地图 Android v2) Activity 在切换 USB 模式时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16417839/

相关文章:

android - 计算用户移动时行进的距离

android - 在 GameThread (android) 中开始由 bool 值触发的新 Activity

python - 在树莓派上使用 python 库 brother_ql 进行打印

java - 当我尝试将数据从 firebase 数据库添加到 firebaseViewHolder 时,Android 应用程序不断停止

windows-7 - Windows 7 中的 USB Missile Launcher 驱动程序

node.js - "OCHI Root Hub Simulation"USB 设备是什么?

android - 禁用和启用查看 android

flutter - 用于 flutter 的谷歌地图插件的授权问题

java - Android中如何在ActionBarActivity中显示ListFragment?

屏幕关闭时的 Android TYPE_STEP_DETECTOR