RxAndroid结合OkHttp实现图片下载、get、post请求

来源:互联网 发布:lookguard软件名 编辑:程序博客网 时间:2024/05/25 23:58

效果:


源码地址:

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实现图片下载、getpost请求 */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>

。。。


0 0
原创粉丝点击