效果:
源码地址:
https://github.com/AndroidDerek/RxRxAndroidOne
视频教程地址:
http://pan.baidu.com/s/1gf7Rya3 密码 m29q
环境依赖配置:
1主项目project的build.gradle
2.当前app的build.gradle
权限
<uses-permission android:name="android.permission.INTERNET"/>
代码:
1.工具类RxAndroidOkhttp
package com.example.rxrxandroidone; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import rx.Observable; import rx.Subscriber; /** * RxAndroid结合OkHttp实现图片下载、get、post请求 */ public class RxAndroidOkhttp { private final String TAG = "GsonUtils"; private OkHttpClient client; private RxAndroidOkhttp() { //创建okhttp对象 client = new OkHttpClient(); //设置连接超时时间为10s client.newBuilder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS); } //创建私有的本类对象 private static RxAndroidOkhttp rxAndroidOkhttp; //创建 单例模式(OkHttp官方建议如此操作) public static RxAndroidOkhttp getInstance() { //对象问空才创建 if (null == rxAndroidOkhttp) { //同步锁解决多线程问题 synchronized (RxAndroidOkhttp.class) { rxAndroidOkhttp = new RxAndroidOkhttp(); } } return rxAndroidOkhttp; } /** * 使用get进行请求,返回服务器传递过来的字符串 * * @param url * @return */ public Observable<String> get(String url) { //创建被观察者 Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { //在没有取消订阅的时候 if (!subscriber.isUnsubscribed()) { //构建get请求 Request request = new Request.Builder().url(url).get().build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //通知订阅者的错误信息 subscriber.onError(e); } @Override public void onResponse(Call call, Response response) throws IOException { if (null != response && response.isSuccessful()) { ///通知订阅者的成功信息 subscriber.onNext(response.body().string()); } //通知完毕 subscriber.onCompleted(); } }); } } }); return observable; } /** * 使用post请求,返回服务器传递过来的字符串 * * @param url * @param params * @return */ public Observable<String> post(String url, Map<String, String> params) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { if (!subscriber.isUnsubscribed()) { FormBody.Builder builder = new FormBody.Builder(); if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } } RequestBody requestBody = builder.build(); //构建post请求 Request request = new Request.Builder().url(url).post(requestBody).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { subscriber.onError(e); } @Override public void onResponse(Call call, Response response) throws IOException { if (null != response && response.isSuccessful()) { subscriber.onNext(response.body().string()); } subscriber.onCompleted();//访问结束 } }); } } }); } /** * 声明一个被观察者对象,作为结果返回 * 返回图形的字节数组 * * @param path * @return */ public Observable<byte[]> downLoadImage(String path) { return Observable.create(new Observable.OnSubscribe<byte[]>() { @Override public void call(Subscriber<? super byte[]> subscriber) { //如果没有订阅 if (!subscriber.isUnsubscribed()) { //访问网络操作 Request request = new Request.Builder().url(path).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { subscriber.onError(e); } @Override public void onResponse(Call call, Response response) throws IOException { if (null != response && response.isSuccessful()) { byte[] data = response.body().bytes(); if (data != null) { subscriber.onNext(data); } } subscriber.onCompleted(); } }); } } }); } }
2.主程序
package com.example.rxrxandroidone; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.util.HashMap; import java.util.Map; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by Administrator on 2017/4/13 0013. * * 步骤:1.定义被观察者;2.定义订阅者(观察者);3.订阅者关联被观察者 */ public class RxAndroidDownload extends AppCompatActivity implements View.OnClickListener { private Button download_image; private ImageView imageView; private static final String TAG = "GsonUtils"; private Button post; private Button get; private TextView return_message; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rxandroiddownload); initView(); } private void initView() { download_image = (Button) findViewById(R.id.download_image); imageView = (ImageView) findViewById(R.id.imageView); download_image.setOnClickListener(this); post = (Button) findViewById(R.id.post); post.setOnClickListener(this); get = (Button) findViewById(R.id.get); get.setOnClickListener(this); return_message = (TextView) findViewById(R.id.return_message); return_message.setOnClickListener(this); } String postPath = "http://fanyi.youdao.com/openapi.do"; /** * 有道词典提供的api查询接口,q=后面拼接的是需要查询的单词 * 参考网站 * 例如:查询words,对应的http://fanyi.youdao.com/openapi.do?keyfrom=imoocdict123456&key=324273592 * &type=data&doctype=json&version=1.1&q=words */ String getPath = "http://fanyi.youdao.com/openapi.do?keyfrom=imoocdict123456&key=324273592&" + "type=data&doctype=json&version=1.1&q=blue"; @Override public void onClick(View v) { switch (v.getId()) { case R.id.download_image: Log.d(TAG, "download_image"); //下载图片 RxAndroidOkhttp rxAndroidOkhttp1 = RxAndroidOkhttp.getInstance(); /** * 1.observable定义被观察者 */ Observable<byte[]> observable = rxAndroidOkhttp1.downLoadImage("https://www.baidu.com/img/bd_logo1.png"); /** * 2.定义订阅者(观察者) */ Subscriber<byte[]> subscriber = new Subscriber<byte[]>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted"); } @Override public void onError(Throwable e) { Log.d(TAG, e.getMessage()); } @Override public void onNext(byte[] bytes) { /** * 订阅者收到变化的字节信息 */ Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); //在主线程中更新ui /*RxAndroidDownload.this.runOnUiThread(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } });*/ //展示图片 imageView.setImageBitmap(bitmap); } }; /** * 3.订阅者关联被观察者 */ /** * Schedulers.io()说明是输入输出的计划任务 * AndroidSchedulers.mainThread()说明订阅者是中ui主线程中执行 */ observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber); break; case R.id.post: Log.d(TAG, "post"); //使用post请求,返回服务器传递过来的字符串 RxAndroidOkhttp rxAndroidOkhttp2 = RxAndroidOkhttp.getInstance(); Map<String, String> params = new HashMap<>(); params.put("keyfrom", "imoocdict123456"); params.put("key", "324273592"); params.put("type", "data"); params.put("doctype", "json"); params.put("version", "1.1"); params.put("q", "red"); Observable<String> observable1 = rxAndroidOkhttp2.post(postPath, params); Subscriber<String> subscriber1 = new Subscriber<String>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted"); } @Override public void onError(Throwable e) { Log.d(TAG, e.getMessage()); } @Override public void onNext(String s) { Log.d(TAG, "s=" + s); return_message.setTextColor(Color.RED); return_message.setText("服务器post返回的数据:" + s); } }; observable1.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber1); break; case R.id.get: Log.d(TAG, "get"); RxAndroidOkhttp rxAndroidOkhttp3 = RxAndroidOkhttp.getInstance(); // 使用get进行请求 Observable<String> observable3 = rxAndroidOkhttp3.get(getPath); Subscriber<String> subscriber3 = new Subscriber<String>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted"); } @Override public void onError(Throwable e) { Log.d(TAG, e.getMessage()); } @Override public void onNext(String s) { Log.d(TAG, "s=" + s); return_message.setTextColor(Color.BLUE); return_message.setText("服务器get返回的数据:" + s); } }; observable3.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber3); break; } } }
布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/download_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="下载图片"/> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="100dp"/> <Button android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="post请求"/> <Button android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="get请求"/> <TextView android:id="@+id/return_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="服务器返回的字符串数据"/> </LinearLayout>
。。。