【问题标题】:application crashes when try to call getMapAsync() method尝试调用 getMapAsync() 方法时应用程序崩溃
【发布时间】:2017-08-07 14:00:06
【问题描述】:

抱歉重复问题,但我无法从以前的问题中得到解决方案。我想在谷歌地图上从mysql映射GPS(纬度,经度)。我从 mysql 得到 lat 和 long 但是当我尝试在谷歌地图上映射它时,我的应用程序崩溃了。我尝试了很多,但它不起作用。它返回

空对象引用

logcat 中的错误。不可能是之前的空对象引用。

我的班级RecGPS代码在这里。

    public class RecGPS extends AppCompatActivity{
private GoogleMap mMap;


    Button btn;
    private ProgressDialog loading;

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


        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                recGps();
            }
        });
    }

    private void recGps() {


        loading = ProgressDialog.show(this, "Please wait ......", "fetching....", false, false);
        String url = Config.URL_CARD_INFO;
        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                loading.dismiss();
                showJSON(response);
            }

        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(RecGPS.this, error.getMessage().toString(), Toast.LENGTH_LONG).show();
                    }
                });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

    private void showJSON(String response) {
        String latitude = "";
        String longitude = "";


        try {
            JSONObject jsonObject = new JSONObject(response);
            JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
            JSONObject collegeData = result.getJSONObject(0);
            latitude = collegeData.getString(Config.TAG_ISSUE_DATE);
            longitude = collegeData.getString(Config.TAG_Expiry_DATE);



        } catch (JSONException e) {
            e.printStackTrace();
        }

Toast.makeText(this,latitude+longitude,Toast.LENGTH_LONG).show();
//        ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);


        ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                mMap=googleMap;
            }
        });
    mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(longitude), Double.parseDouble(latitude))));



}

}

我的 .XML 文件

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_rec_gps"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.hp.getgpscoordinates.RecGPS">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="400dp">
        <fragment
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/map"
            android:clickable="true"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            />
    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn"/>
</LinearLayout>

Logcat

Attempt to invoke virtual method 'void com.google.android.gms.maps.MapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference
     at com.example.hp.getgpscoordinates.RecGPS.showJSON(RecGPS.java:92)
     at com.example.hp.getgpscoordinates.RecGPS.access$200(RecGPS.java:25)
     at com.example.hp.getgpscoordinates.RecGPS$2.onResponse(RecGPS.java:56)
     at com.example.hp.getgpscoordinates.RecGPS$2.onResponse(RecGPS.java:52)
     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
     at android.os.Handler.handleCallback(Handler.java:739)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:148)
     at android.app.ActivityThread.main(ActivityThread.java:7325)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

【问题讨论】:

  • 请添加您的 logcat 报告
  • 向问题添加崩溃日志
  • 您的 onMapReady() 方法和其他 Google Map 生命周期方法在哪里?无意冒犯,但这段代码有味道。我的建议:添加断点并准确指出代码崩溃的位置。
  • @OussemaAroua 请立即查看

标签: android mysql google-maps google-maps-markers


【解决方案1】:

NullPointerException 是由这个引起的:

((MapFragment) getFragmentManager().findFragmentById(R.id.map))

尝试使用SupportMapFragment 而不是getFragmentManager

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

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(longitude), Double.parseDouble(latitude))));
    }

【讨论】:

  • 它正在工作,但现在问题在于 addMarker.Plz 指导如何解决它.....mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(longitude), Double.parseDouble(latitude))));
【解决方案2】:

地图准备就绪后添加标记

((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                mMap=googleMap;
                mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(longitude), Double.parseDouble(latitude))));
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多