2016-03-10 3 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 для этого. Это будет работать? И да, пожалуйста, сделайте немного легким для меня; Я относительно новичок в Android & Java.

+0

превратят 'частный LatLng LatLng,' 'в 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;} 
} 

Вы можете добавить геттеры и сеттеры. Я также дал мне конструктор, который принял контекст, и только вызвал его однажды из моей основной деятельности, и он позволил мне реализовать управление предпочтениями внутри класса, что было полезно для более сложных данных, которые я сохраняю для сохранения.

Чтобы использовать его в любом месте, просто сделать это:

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

Etc ...

+0

Хм, интересно. Я попробую, и отметьте свой ответ, если он будет принят. Благодаря! :) –

Смежные вопросы