2016-05-12 73 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

感谢您的帮助,测试并运行良好。 –