将AsyncTask转换为RxJava

时间:2017-06-21 16:42:07

标签: android android-asynctask rx-java

  

对Rx来说是新手,所以我正在寻找一些帮助将以下AsyncTask转换为Rx,希望所以我可以使用我已经知道的代码更多地将Rx可视化。我发现了一些其他有些相关的SO答案,但很多都没有网络请求,很多人使用不同的运算符来解决不同的问题,所以有点困惑。

继承AsyncTask:

  

这是我的WhatsTheWeather应用程序的Java代码(包括MainActivity的所有代码):

function makeFunc() {
    var name = "Mozilla";
    function displayName() {
        alert(name);
    }
    return displayName;
}
var myFunc = makeFunc();
myFunc();

2 个答案:

答案 0 :(得分:1)

试试这个。

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。

答案 1 :(得分:0)

在整合Retrofit之前,您应该了解一些事项。

  • 尽量不要使用旧版Retrofit
  • Retrofit2是您当前应该使用的
  • 尝试避免RetrofitRxJavaRxAndroid的代码集成 目前(初学者太复杂)
  • 确保您熟悉GSONJackson
  • HttpClient已弃用,而OkHttp比[{1}} 通常使用的HttpUrlConnection要快。{/ 1}
  • 最后,这里是Retrofit2的link。它非常详细且易于理解。杰克沃顿尽力使其易于理解。