2017-10-13 17 views
-2

私はこのコードを持っていますが、RxJava 2に変更する方法はわかりません。このコードはGoogle APIからJSONを取得し、私の場所(緯度と経度)を取得するのに役立ちます。助けてください:AsyncTaskをRxJavaに変更する方法

class DownloadLocal extends AsyncTask<String,Void,String> { 

    @Override 
    protected String doInBackground(String... strings) { 
     StringBuilder stringBuilder = new StringBuilder(); 
     try { 
      URL url = new URL(strings[0]); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
      httpURLConnection.connect(); 

      InputStream inputStream = httpURLConnection.getInputStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 

      while ((line = bufferedReader.readLine()) != null){ 
       stringBuilder.append(line+"\n"); 
      } 



     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return stringBuilder.toString(); 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     String address = ""; 
     try { 
      JSONObject jsonObject = new JSONObject(s); 
      JSONArray results = jsonObject.getJSONArray("results"); 
      for (int i =0 ;i<results.length();i++){ 
       JSONObject object = results.getJSONObject(i); 
       address = object.getString("formatted_address"); 
       JSONObject geometry = object.getJSONObject("geometry"); 
       JSONObject location = geometry.getJSONObject("location"); 
       latitude = (double) location.get("lat"); 
       longitude = (double) location.get("lng"); 
      } 
      if(address == null){ 
       Toast.makeText(getActivity(),"Can't get Address !!! Try Again ...", Toast.LENGTH_SHORT).show(); 
       return; 
      } 
      else{ 
       googleMap.clear(); 
       String link = "https://maps.googleapis.com/maps/api/directions/json?origin=" + locationNow.getLatitude() + "," + locationNow.getLongitude() 
         + "&destination=" + latitude+ "," + longitude +"&key=APIKEY"; 
       LatLng latLng = new LatLng(locationNow.getLatitude(),locationNow.getLongitude()); 
       MarkerOptions markerOptions = new MarkerOptions(); 
       markerOptions.position(latLng); 
       markerOptions.title("Me"); 

       googleMap.addMarker(markerOptions); 
       Location locationPoint = new Location(""); 

       locationPoint.setLatitude(latitude); 
       locationPoint.setLongitude(longitude); 
       double distance = locationNow.distanceTo(locationPoint)/1000; 
       txtdistance.setText(String.format("%.3f",distance)+" km"); 
       LatLng latLngPoint = new LatLng(latitude,longitude); 
       MarkerOptions markerOptionsPoint = new MarkerOptions(); 
       markerOptionsPoint.position(latLngPoint); 
       markerOptionsPoint.title("Point"); 
       googleMap.addMarker(markerOptionsPoint); 
       CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLngPoint,14); 
       googleMap.moveCamera(cameraUpdate); 
       mapPresenter.DislayStreet(googleMap,link); 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

私はこのコードを変更する方法がわかりません。私はRxJavaについて理解していません!チュートリアルがあれば教えてください。私は自分の仕事のためにRxJavaについて学びたいと思っています。

+0

手動のHttpURLConnectionによってダウンロード文字列からJSONを解析する必要がないようにあなたが最初の改修とGSONについての学習を検討すべきです – EpicPandaForce

答えて

0

ObservableとRETROFITを使用して学習を開始できます。これはRxJavaの理解を深める上で重要です。

0

RxJava、Dagger、Retrofit、Gsonを含むRepoを1つ作成しました。私はそれがあなたに多くを助けると思う。 Github link

もし役立つ場合は、それを主演することを検討してください。

0

これはRxAndroidにAsyncTaskを変換する方法である:

Single.fromCallable(new Callable<LoginResponse>() { 
     @Override 
     public LoginResponse call() throws Exception { 
      // Doing something long in AysnTask doInBackGround off UI thread. 
      return yourResponse; 
     } 
    }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnSuccess(new Consumer<LoginResponse>() { 
       @Override 
       public void accept(LoginResponse loginResponse) throws Exception { 
        // Onpost Execute with success in Main Thread 
       } 
      }) 
      .doOnError(new Consumer<Throwable>() { 
       @Override 
       public void accept(Throwable throwable) throws Exception { 
        // do on Error 
       } 
      }) 
      .subscribe(); 
関連する問題