如何解决由于缺少onError处理程序subscriptionmethod.retrofit2.adapter.rxjava2.HttpException:HTTP400而未处理OnErrorNotImplementedException异常
我的地图应用程序搜索标记崩溃时出现以下错误:
错误:io.reactivex.exceptions.OnErrorNotImplementedException: 由于缺少缺少onError处理程序,因此未处理异常 subscription()方法调用。进一步阅读: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | retrofit2.adapter.rxjava2.HttpException:HTTP 400
private void moveMarkerAnimation(String key,AnimationModel animationModel,Marker currenrMarker,String from,String to) {
if (!animationModel.isRun())
{
//Request API
compositeDisposable.add(iGoogleAPI.getDirections("diving","less_driving",from,to,getString(R.string.google_api_key))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(returnResult -> {
Log.d("API_RETURN",returnResult);
try {
//Parse JSON
JSONObject jsonObject = new JSONObject(returnResult);
JSONArray jsonArray = jsonObject.getJSONArray("routes");
for (int i=0;i<jsonArray.length();i++)
{
JSONObject route = jsonArray.getJSONObject(i);
JSONObject poly = route.getJSONObject("overview_polyline");
String polyline = poly.getString("points");
polylineList = decodePoly(polyline);
}
//Moving
handler = new Handler();
index = -1;
next = 1;
Runnable runnable = new Runnable() {
@Override
public void run() {
if (polylineList.size() > 1)
{
if (index < polylineList.size() - 2)
{
index++;
next = index+1;
start = polylineList.get(index);
end = polylineList.get(next);
}
ValueAnimator valueAnimator = ValueAnimator.ofInt(0,1);
valueAnimator.setDuration(3000);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(value -> {
v = value.getAnimatedFraction();
lat = v*end.latitude + (1-v) * start.latitude;
lng = v*end.longitude + (1-v) * start.longitude;
LatLng newPos = new LatLng(lat,lng);
currenrMarker.setPosition(newPos);
currenrMarker.setAnchor(0.5f,0.5f);
currenrMarker.setRotation(getBearing(start,newPos));
});
valueAnimator.start();
if (index < polylineList.size() - 2) //Reach destination
handler.postDelayed(this,1500);
else if (index < polylineList.size() - 1) //Done
{
animationModel.setRun(false);
common.driverLocationSubscribe.put(key,animationModel); //update data
}
}
}
};
//Run Handler
handler.postDelayed(runnable,1500);
}catch (Exception e)
{
Snackbar.make(getView(),e.getMessage(),Snackbar.LENGTH_SHORT).show();
}
}));
//,Throwable::printStackTrace));
}
}
//GET BEARING
public static float getBearing(LatLng begin,LatLng end) {
//You can copy this function by link at description
double lat = Math.abs(begin.latitude - end.latitude);
double lng = Math.abs(begin.longitude - end.longitude);
if (begin.latitude < end.latitude && begin.longitude < end.longitude)
return (float) (Math.toDegrees(Math.atan(lng / lat)));
else if (begin.latitude >= end.latitude && begin.longitude < end.longitude)
return (float) ((90 - Math.toDegrees(Math.atan(lng / lat))) + 90);
else if (begin.latitude >= end.latitude && begin.longitude >= end.longitude)
return (float) (Math.toDegrees(Math.atan(lng / lat)) + 180);
else if (begin.latitude < end.latitude && begin.longitude >= end.longitude)
return (float) ((90 - Math.toDegrees(Math.atan(lng / lat))) + 270);
return -1;
}
//DECODE POLY
public static List<LatLng> decodePoly(String encoded) {
List poly = new ArrayList();
int index=0,len=encoded.length();
int lat=0,lng=0;
while(index < len)
{
int b,shift=0,result=0;
do{
b=encoded.charAt(index++)-63;
result |= (b & 0x1f) << shift;
shift+=5;
}while(b >= 0x20);
int dlat = ((result & 1) != 0 ? ~(result >> 1):(result >> 1));
lat += dlat;
shift = 0;
result = 0;
do{
b = encoded.charAt(index++)-63;
result |= (b & 0x1f) << shift;
shift +=5;
}while(b >= 0x20);
int dlng = ((result & 1)!=0 ? ~(result >> 1): (result >> 1));
lng +=dlng;
LatLng p = new LatLng((((double)lat / 1E5)),(((double)lng/1E5)));
poly.add(p);
}
return poly;
}
IGoogleAPI.class:
public interface IGoogleAPI {
@GET("maps/api/directions/json")
Observable<String> getDirections(
@Query("mode") String mode,@Query("transit_routing_preference") String transit_routing,@Query("orgin") String from,@Query("destination") String to,@Query("key") String key
);
}
RetrofitClient.class:
public class RetrofitClient {
private static Retrofit instance;
public static Retrofit getInstance()
{
return instance == null ? new Retrofit.Builder()
.baseUrl("https://maps.googleapis.com/")
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build() : instance;
}
}
完整错误日志:
io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | retrofit2.adapter.rxjava2.HttpException: HTTP 400
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:281)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: retrofit2.adapter.rxjava2.HttpException: HTTP 400
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:57)
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:38)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:48)
at io.reactivex.Observable.subscribe(Observable.java:12267)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:35)
at io.reactivex.Observable.subscribe(Observable.java:12267)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:784)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。