簡體   English   中英

從onMapready方法移到onlocationchanged方法時,App崩潰

[英]App Crashed when moves to onlocationchanged method from onMapready method

我正在學習android中的地圖以顯示用戶在地圖中的位置。首先,我使用.getmap()函數來初始化地圖,但它已被貶值,然后從谷歌搜索后,我來到onMapready()上做了一些修改並用於onMapready()。

但是我的地圖變量僅在默認位置工作,它不運行onlocationchange方法。從onMapready函數返回后,mMap變量具有空值,並且僅在地圖上顯示悉尼(默認)位置。我在OnCreate中使用了一個條件來檢查mMap並始終給出null,並且不會轉到中的else條件。我的onlocation方法如何工作?

我有很多人使用過GoogleApi客戶端,但是對此我一無所知。此外,我不確定我使用的方法是否可以有效地獲得用戶的位置。onMapreadyFuction是否還有其他工作要做? ?

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener {

private GoogleMap mMap;
LocationManager locationManager;
String provider;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

    SupportMapFragment mapFragment =((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
    mapFragment.getMapAsync(this);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.

    if (mMap==null)  // check mMap null after onMapready
    {
        Toast.makeText(getApplicationContext(),"My Toast",Toast.LENGTH_LONG).show();
    }
    else
    {


    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    provider = locationManager.getBestProvider(new Criteria(), false);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling

        return;
    }

    Location location = locationManager.getLastKnownLocation(provider);

    if (location!=null)
    {
        //Toast.makeText(getApplicationContext(),"My Toast",Toast.LENGTH_LONG).show();
        onLocationChanged(location);
    }
 }

}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    //Toast.makeText(getApplicationContext(),"No sydney?",Toast.LENGTH_LONG).show();
   // mMap.addMarker(new MarkerOptions().position(new LatLng(0,0)).title("Your location"));

}

@Override
public void onLocationChanged(Location location) {

    Double lat = location.getLatitude();
    Double lng = location.getLongitude();
    LatLng pos = new LatLng(lat, lng);
    //Toast.makeText(getApplicationContext(),"My Toast",Toast.LENGTH_LONG).show();

    SupportMapFragment mapFragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
    mapFragment.getMapAsync(this);

    mMap.addMarker(new MarkerOptions().position(pos).title("Your location"));
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 12)) ;

}

您要處理兩個不同的需求,顯示Google Map片段並監視位置更新,因此您應該分別對待它們。

異步調用getMapAsync (顧名思義)后, Google Map就會初始化,因此它不會中斷任何其他工作。 僅擁有一個googleMap實例(即,僅調用一次上述方法)非常重要,否則您將面臨意外行為。

您應該在onCreate調用getMapAsync並使用getMapAsync中的地圖實例做任何您想做的onMapReady ,可以保證一旦GoogleMap實例可用就可以調用它。 刪除對getMapAsync任何其他調用。

像您一樣,從LocationManager請求位置更新 此提供程序也異步工作,因此可以在映射准備好之前調用其回調onLocatedUpdated 在此回調以及使用該地圖實例但可以在該實例可用之前調用的任何其他方法中,必須在使用該實例之前檢查該地圖實例是否不為null ,否則將面臨NullPointerException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM