2016-03-10 33 views
0

我正在将IntentService电话从MainActivity发送到名为MapClass的类。 MapClass有一个名为MapClassInner的内部类,它计算用户的当前坐标。但是,外部类包含onHandleIntent方法,该方法最终将使用广播将坐标发送回MainActivity。我的问题是 - 我如何访问MapClassInner的内部变量?我很确定答案很简单,但我一直在这个项目上连续2个小时,所以我的想法变得有点错误。无法从内部类检索LatLng

下面的代码(MapClass.java):

import android.app.IntentService; 
import android.content.Intent; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
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; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.model.LatLng; 
import org.greenrobot.eventbus.EventBus; 
import org.greenrobot.eventbus.Subscribe; 
import meetup.be2015.gcm_meetup.MainActivity.MyLocationReceiver; 


public class MapClass extends IntentService { 
    public static final String REQUEST_STRING = "myRequest"; 
    public static final String RESPONSE_LAT = "lat"; 
    public static final String RESPONSE_LNG = "lng"; 
    public GoogleMap map; 

public MapClass() { 
    super("MapClass"); 
} 

private class MapClassInner extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

    private GoogleApiClient mGoogleApiClient; 
    private GoogleMap mgoogleMap; 
    private LatLng latLng; 

    private GoogleApiClient client; 

    public MapClassInner(GoogleMap map){ 
     this.mgoogleMap = map; 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     Log.d("ON_MAP_READY","In OnMapReady"); 
     mgoogleMap = googleMap; 
     mgoogleMap.setMyLocationEnabled(true);  //Sets location to current position 
     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
    } 

    protected synchronized void buildGoogleApiClient() { 
     Log.d("BUILD", "In buildClient()"); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     Log.d("ON_CONNECTED","In onConnected()"); 
     Location MLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (MLastLocation != null) { 
      latLng = new LatLng(MLastLocation.getLatitude(), MLastLocation.getLongitude()); 


     } else { 
      Log.d("onConnected", "Value of LatLng is NULL"); 
      latLng = new LatLng(0, 0); 
     } 
    } 

    public LatLng getLatLng(){ 
     return this.latLng; 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     //Notify 
     Log.d("ConnectionSuspended", "Connection Suspended. Status: " + i); 
     mgoogleMap.clear(); 
     mGoogleApiClient.disconnect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     //Notify 
     Log.d("ConnectionFailed", "Connection Failed. Status: " + connectionResult.toString()); 
     mgoogleMap.clear(); 
     mGoogleApiClient.disconnect(); 
    } 
} 



@Override 
protected void onHandleIntent(Intent intent) { 
    //Instantiating the inner class 
    MapClassInner inner = new MapClassInner(map); 

    //Trying to access the inner LatLng variable 
    LatLng coords = inner.getLatLng(); 

    //Gives me a NullPointerException 

    //Converting them to String values 
    String lat = String.valueOf(coords.latitude); 
    String lng = String.valueOf(coords.longitude); 

    //Sending broadcast Intent 
    Intent broadcastIntent = new Intent(); 
    broadcastIntent.setAction(MyLocationReceiver.PROCESS_RESPONSE); 
    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); 
    broadcastIntent.putExtra(RESPONSE_LAT, lat); 
    broadcastIntent.putExtra(RESPONSE_LNG, lng); 
    sendBroadcast(broadcastIntent); 
} 
} 

我怎样才能从内部类的LatLng?我正在考虑为此的EventBus。它会起作用吗?是的,请对我轻松一点;我对Java的Android &比较陌生。

+0

转'私人经纬度的latLng;''到经纬度的latLng;' – injecteer

回答

1

我在所有代码中所做的简化操作是创建一个静态的'AppData.java'类,并且可以从我的包中的任何类访问。然后我把这样的数据放在那里。

public class AppData 
{ 

    private static final AppData appData = new AppData(); // Make a static instance so it is not re-inited. 

    // My data 
    public Location lastKnownLocation; 

    /** 
    * Method to return the static instance of the AppData. 
    * 
    * @return An AppData object that is static so you can get/set global data across the application. 
    */ 
    public static AppData getInstance() {return appData;} 
} 

您可以添加getters和setter。我也给了我一个构造函数,这个构造函数使用了一个Context,并且只从我的主活动中调用过一次,它让我可以在类中实现Preference Management,这有助于我为保持持久性而存储更复杂的数据。

在任何地方使用它,只是这样做:

AppData appData = AppData.getInstance(); 
appData.lastKnownLocation = <whatever your code does> 

等...

+0

嗯,有趣。我会试试看,如果它的工作原因,你的答案被接受为接受。谢谢! :) –