GoogleApiClient空指针异常

时间:2015-05-07 13:12:02

标签: java android google-api-client

我尝试学习android开发,现在我开发了一个融合定位服务的应用程序。

当我想要将GoogleMap片段,Textviews与纬度和经度以及其他一些小部件放在一起时,我得到了一个RunFragment.java类。 首先,我想连接到GoogleApiClient,我创建了一个新类,它将完成所有这些工作,并保持RunFragment.java清除。 (这是一个好主意吗??) 当我尝试运行我的应用程序时出现此错误:

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.content.Context.getMainLooper()' on a null object reference
        at com.google.android.gms.common.api.GoogleApiClient$Builder.<init>(Unknown Source)
        at com.runtheworld.roman.runtheworld.GoogleAPI.buildGoogleApiClient(GoogleAPI.java:28)
        at com.runtheworld.roman.runtheworld.RunFragment.onCreate(RunFragment.java:39)
        at android.app.Fragment.performCreate(Fragment.java:2031)

有相关的课程:

RunFragment.java

package com.runtheworld.roman.runtheworld;

import android.app.Fragment;
import android.os.Bundle;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;



public class RunFragment extends Fragment  {

private static View view;

// TextViews
TextView lat,lon;

// GoogleApi
private GoogleAPI mGoogleApiClient = new GoogleAPI(getActivity());



// Default Constructor
public RunFragment() {
}


@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    mGoogleApiClient.buildGoogleApiClient();
}
@Override
public void onStart(){
    super.onStart();
    mGoogleApiClient.Connect();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
            parent.removeView(view);
    }
    try {
        view = inflater.inflate(R.layout.run_fragment, container, false);
    } catch (InflateException e) {
        // Map already created
    }

    lat = (TextView)view.findViewById(R.id.lat);
    lon = (TextView)view.findViewById(R.id.lon);
    lat.setText(String.valueOf(mGoogleApiClient.getLat()));
    lon.setText(String.valueOf(mGoogleApiClient.getLon()));


    return view;
}




}

GoogleAPI.java

package com.runtheworld.roman.runtheworld;


import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;

public class GoogleAPI  implements GoogleApiClient.ConnectionCallbacks,    GoogleApiClient.OnConnectionFailedListener {

private Context context;
private GoogleApiClient mGoogleApiClient;
private boolean isConnected;
// Location
Location mLastLocation;

public GoogleAPI(Context c) {
    context = c;
}


protected synchronized void buildGoogleApiClient() {
    Log.d("MYTAG", "BUILDING GOOGLE API");
    mGoogleApiClient = new GoogleApiClient.Builder(context)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

public boolean Connect(){
    if (!mGoogleApiClient.isConnected())
        mGoogleApiClient.connect();
    else
    Log.d("MYTAG","GoogleApiClient is already connected!");
    return isConnected;
}

@Override
public void onConnected(Bundle bundle) {
    Log.d("MYTAG", "GOOGLE API CONNECTED!");
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
    if (mLastLocation != null) {
    }
}

public double getLat(){
    return mLastLocation.getLatitude();
}
public double getLon(){
    return mLastLocation.getLongitude();
}
@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

听起来您的初始问题已在评论中修复,以下是如何完成功能。

首先,要修复NPE,请确保mLocation在引用之前不为空:

public double getLat(){
    double retVal = 0d;
    if (mLastLocation != null){
       retVal = mLastLocation.getLatitude();
    }
    return retVal;
}
public double getLon(){
    double retVal = 0d;
    if (mLastLocation != null){
       retVal = mLastLocation.getLongitude();
    }
    return retVal;
}

下一个问题是getLastLocation()很有可能返回null。

解决这个问题的最佳方法是注册位置监听器。

GoogleAPI声明为位置监听器:

public class GoogleAPI  implements GoogleApiClient.ConnectionCallbacks,    GoogleApiClient.OnConnectionFailedListener, LocationListener{

private Context context;
private GoogleApiClient mGoogleApiClient;
private boolean isConnected;

然后在onConnected()中注册一位听众(请参阅documentation:了解如何设置minTimefastestTimedistanceThreshold的值:< / p>

        @Override
        public void onConnected(Bundle bundle) {
            Log.d("MYTAG", "GOOGLE API CONNECTED!");
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
            if (mLastLocation == null) {
               mLocationRequest = new LocationRequest();
               mLocationRequest.setInterval(minTime);
               mLocationRequest.setFastestInterval(fastestTime);
                                 mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
              mLocationRequest.setSmallestDisplacement(distanceThreshold);
              LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            }

        }

然后添加位置更改回调:

 @Override
    public void onLocationChanged(Location location) {

             mLastLocation = location;

     }