2016-05-12 29 views
1

我想第一次進入反應式編程,所以請在我身上輕鬆一下。我正在使用Android的ReactiveLocation庫,並且在收到新位置時,我需要使用位置數據填充4個文本視圖。RxAndroid:如何正確地將流正確分成4個操作:

所以這是代碼,這將讓我的位置上的每個位置更新:

locationProvider = new ReactiveLocationProvider(getApplicationContext()); 
    lastKnownLocationObservable = locationProvider.getLastKnownLocation(); 

    final LocationRequest locationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setNumUpdates(150) 
      .setInterval(100); 
    locationUpdatesObservable = locationProvider 
      .checkLocationSettings(
        new LocationSettingsRequest.Builder() 
          .addLocationRequest(locationRequest) 
          .setAlwaysShow(true) //Refrence: http://stackoverflow.com/questions/29824408/google-play-services-locationservices-api-new-option-never 
          .build() 
      ) 
      .doOnNext(new Action1<LocationSettingsResult>() { 
       @Override 
       public void call(LocationSettingsResult locationSettingsResult) { 
        Status status = locationSettingsResult.getStatus(); 
        if (status.getStatusCode() == LocationSettingsStatusCodes.RESOLUTION_REQUIRED) { 
         try { 
          status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); 
         } catch (IntentSender.SendIntentException th) { 
          Log.e("MainActivity", "Error opening settings activity.", th); 
         } 
        } 
       } 
      }) 
      .flatMap(new Func1<LocationSettingsResult, Observable<Location>>() { 
       @Override 
       public Observable<Location> call(LocationSettingsResult locationSettingsResult) { 
        return locationProvider.getUpdatedLocation(locationRequest); 
       } 
      }); 

我也有這個函數功能,將位置分割成4個字符串數組:

public class LocationToStringsArrayListFunc implements Func1<Location, ArrayList<String>> { 
    @Override 
    public ArrayList<String> call(Location location) { 
     ArrayList<String> locationDetails = null; 
     if (location != null) { 
      locationDetails = new ArrayList<>(); 
      locationDetails.add(String.valueOf(location.getLatitude())); 
      locationDetails.add(String.valueOf(location.getLongitude())); 
      locationDetails.add(String.valueOf(location.getTime())); 
      locationDetails.add(String.valueOf(location.getSpeed())); 
     } 
     return locationDetails; 
    } 
} 

Finaly我有這樣的行動pupulate文本TextView的:

public class DisplayTextOnViewAction implements Action1<String> { 
    private final TextView target; 

    public DisplayTextOnViewAction(TextView target) { 
     this.target = target; 
    } 

    @Override 
    public void call(String s) { 
     target.setText(s); 
    } 
} 

我現在想要的是每次拆分此流4次,我知道,對於一個我將做到以下幾點:

mUpdatableLocationSubscription = locationUpdatesObservable 
      .map(new LocationToStringsArrayListFunc()) 
      .map(new Func1<ArrayList<String>, String>() { 

       @Override 
       public String call(ArrayList<String> stringArrayList) { 
        return stringArrayList.get(0); 
       } 
      }) 
      .subscribe(new DisplayTextOnViewAction(tvLatitudeValue), new ErrorHandler()); 

我的問題是:如何popluate其他3 TextView中的:LongitudeValue,tvLastUpdateValue,tvSpeedValue使用相同的流?

在此先感謝。

回答

4

.share()運營商是你應該看的。

有了這個 「助手」 類:

public class ListItemFunc extends Func1<ArrayList<String>, String>{ 

    private final int index; 

    public ListItemFunc(int index) { 
     this.index = index; 
    } 

    @Override 
    public String call(ArrayList<String> strings) { 
     return strings.get(index); 
    } 
} 

您的代碼可以是這樣的:

Observable<ArrayList<String>> sharedObservable = 
     locationUpdatesObservable.map(new LocationToStringsArrayListFunc()).share(); 

latitudeSubscription = sharedObservable 
     .map(new ListItemFunc(0)) 
     .subscribe(new DisplayTextOnViewAction(tvLatitudeValue), new ErrorHandler()); 

longitudeSubscription = sharedObservable 
     .map(new ListItemFunc(1)) 
     .subscribe(new DisplayTextOnViewAction(tvLongitudeValue), new ErrorHandler()); 

lastUpdateSubscription = sharedObservable 
     .map(new ListItemFunc(2)) 
     .subscribe(new DisplayTextOnViewAction(tvLastUpdateValue), new ErrorHandler()); 

speedSubscription = sharedObservable 
     .map(new ListItemFunc(3)) 
     .subscribe(new DisplayTextOnViewAction(tvSpeedValue), new ErrorHandler()); 
+0

感謝您的幫助,測試並運行良好。 –