2017-06-21 7 views
0

Rxの新機能ですので、次のAsyncTaskをRxに変換するための助けを捜していますので、Rxをもう少し詳しく知ることができます。私はいくつかの他のSOの答えを見つけましたが、それは多少関連していましたが、それらの多くはネットワーク要求をしておらず、回答者ごとに異なる演算子を使用していました。AsyncTaskをRxJavaに変換する

相続人AsyncTask:

ここでは、(MainActivityからすべてのコードが含まれている)WhatsTheWeather Appの私のJavaコードです:

public class MainActivity extends AppCompatActivity { 

EditText cityName; 
TextView resultTextview; 

public void findTheWeather(View view){ 
    Log.i("cityName", cityName.getText().toString()); 

    InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    mgr.hideSoftInputFromWindow(cityName.getWindowToken(), 0); 

    try { 
     String encodedCityName = URLEncoder.encode(cityName.getText().toString(), "UTF-8"); 
     DownLoadTask task = new DownLoadTask(); 
     task.execute("http://api.openweathermap.org/data/2.5/weather?q=" + cityName.getText().toString() + "&appid=a018fc93d922df2c6ae89882e744e32b"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     Toast.makeText(getApplicationContext(),"Could not find weather",Toast.LENGTH_LONG).show(); 
    } 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    cityName = (EditText)findViewById(R.id.cityName); 
    resultTextview = (TextView) findViewById(R.id.resultTextView); 

} 


public class DownLoadTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... urls) { 
     String result = ""; 
     URL url; 
     HttpURLConnection urlConnection = null; 
     try { 
      url = new URL(urls[0]); 
      urlConnection = (HttpURLConnection)url.openConnection(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      InputStreamReader reader = new InputStreamReader(inputStream); 

      int data = reader.read(); 
      while(data != -1){ 
       char current = (char) data; 
       result +=current; 
       data = reader.read(); 
      } 
      return result; 

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

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     try { 
      String message = ""; 
      JSONObject jsonObject = new JSONObject(result); 

      String weatherInfo = jsonObject.getString("weather"); 
      Log.i("Weather content", weatherInfo); 
      JSONArray arr = new JSONArray(weatherInfo); 

      for(int i=0; i<arr.length(); i++){ 
       JSONObject jsonPart = arr.getJSONObject(i); 

       String main = ""; 
       String description=""; 

       main = jsonPart.getString("main"); 
       description = jsonPart.getString("description"); 

       if(main != "" && description != ""){ 
        message += main + ": "+ description + "\r\n"; //for a line break 
       } 

      } 

      if (message != ""){ 
       resultTextview.setText(message); 
      } else { 
       Toast.makeText(getApplicationContext(),"Could not find weather",Toast.LENGTH_LONG).show(); 
      } 
     } catch (JSONException e) { 
      Toast.makeText(getApplicationContext(),"Could not find weather",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

これまでに試したことはありますか? –

+0

あなたの質問は、コードブロックがまとめられていて、実際の質問がブロック引用符に分割されていないと読みやすくなります。 [Markdown help](https://stackoverflow.com/editing-help)ドキュメントは、これを行う方法を示しています。 – jeffbyrnes

答えて

0

物事のカップルは、あなたがあります。 Retrofitを統合する前に知っておく必要があります。

  • Retrofit
  • Retrofit2の古いバージョンを使用しないようにしてください、あなたは現在の(あまりにも多く複雑でRxJavaまたはRxAndroidRetrofitのコードの統合を回避してください現在
  • で使うことになっているものです初心者の方)
  • GSONまたはJacksonも熟知していることをご確認ください。 OkHttpが比較的速く、一般的にRetrofit2
  • 最後に、ここでlink Retrofit2用で使用されHttpUrlConnectionよりもある一方で
  • HttpClientが減価償却されます。詳細で分かりやすく分かりやすい。 Jack Whartonは、できるだけ理解しやすいように最善を尽くしました。
+0

ありがとう!それは助ける。 –

+1

HttpUrlConnectionは非推奨ではありません... –

+0

@ crickrt_007のレビューありがとうございます。私はいくつかの編集をしました。 –

0

これを試してください。

public void networkCall(final String urls) { 
    Observable.fromCallable(new Func0<String>() { 
     @Override 
     public String call() { 
      String result = ""; 
      URL url = null; 
      HttpURLConnection urlConnection = null; 
      try { 
       url = new URL(urls); 
       urlConnection = (HttpURLConnection) url.openConnection(); 

       InputStream inputStream = urlConnection.getInputStream(); 
       InputStreamReader reader = new InputStreamReader(inputStream); 

       int data = reader.read(); 

       while (data != -1) { 
        char current = (char) data; 
        result += current; 
        data = reader.read(); 
       } 

       try { 
        String message = ""; 
        JSONObject jsonObject = new JSONObject(result); 

        String weatherInfo = jsonObject.getString("weather"); 
        Log.i("Weather content", weatherInfo); 
        JSONArray arr = new JSONArray(weatherInfo); 

        for (int i = 0; i < arr.length(); i++) { 
         JSONObject jsonPart = arr.getJSONObject(i); 

         String main = ""; 
         String description = ""; 

         main = jsonPart.getString("main"); 
         description = jsonPart.getString("description"); 

         if (main != "" && description != "") { 
          message += main + ": " + description + "\r\n"; //for a line break 
         } 

        } 

        return message; 

       } catch (JSONException e) { 
        Toast.makeText(getApplicationContext(), "Could not find weather", Toast.LENGTH_LONG).show(); 
       } 


      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    }) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Subscriber<String>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(String message) { 
      if (message != ""){ 
       resultTextview.setText(message); 
      } else { 
       Toast.makeText(getApplicationContext(),"Could not find weather",Toast.LENGTH_LONG).show(); 
      } 
     } 
    }); 
} 

しかし、RetrofitとRxJavaを併用することをおすすめします。

関連する問題