2017-06-21 98 views
0

Rx的新功能,所以在尋找將以下AsyncTask轉換爲Rx的幫助後,希望能夠使用我已經知道的某些代碼來可視化Rx。我發現了一些其他的答案,這些答案有點相關,但是它們中的很多不需要網絡請求,而且許多人使用不同的操作符來提供不同的答案,所以我有點困惑。將AsyncTask轉換爲RxJava

繼承人的的AsyncTask:

這裏是我的WhatsTheWeather應用程序的Java代碼(從在MainActivity所有代碼都包含):

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幫助](https://stackoverflow.com/editing-help)文檔演示瞭如何執行此操作。 – jeffbyrnes

回答

0

有幾件事情你在整合Retrofit之前應該知道。

  • 儘量不要使用Retrofit
  • Retrofit2舊版本是你應該在當前
  • 使用盡量避免與目前的(太複雜RxJavaRxAndroidRetrofit代碼集成了一個對於初學者)
  • 確保您也熟悉GSONJackson
  • HttpClient折舊而OkHttp相對快於HttpUrlConnection通常使用由Retrofit2
  • 最後,這裏的link爲Retrofit2。它非常詳細且易於理解。傑克沃頓盡力使其儘可能簡單易懂。
+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。

相關問題