RxJava+RxAndroid+OKHTTP实现get post 以及下载图片功能
来源:互联网 发布:威廉·密里根 知乎 编辑:程序博客网 时间:2024/06/06 00:33
RxJava+RxAndroid+OKHTTP项目一
开发环境AndroidStudio
1.配置jar
compile 'io.reactivex:rxjava:1.3.2'compile 'io.reactivex:rxandroid:1.2.1'compile 'com.squareup.okhttp3:okhttp:3.9.0'
2.常量类 设置超时时间
public class ROConstants { public static final long timeout=20;//超时时间20秒}
3.工具类 获取 OkHttpClient 对象 封装get post请求
package com.wjn.rxandroidokhttpdemo.utils;import com.wjn.rxandroidokhttpdemo.constants.ROConstants;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;/** * Created by Administrator on 2017/9/22. * RxAndroid结合OkHttp 工具类 单例 */public class RxAndroidOkhttp { private OkHttpClient mOkHttpClient=null;//OkHttpClient 对象 private static RxAndroidOkhttp mRxAndroidOkhttp=null;//RxAndroidOkhttp 对象 /** * 构造方法私有化 * */ private RxAndroidOkhttp(){ //创建okhttp对象 mOkHttpClient=new OkHttpClient(); //设置连接超时时间为20s mOkHttpClient.newBuilder() .connectTimeout(ROConstants.timeout, TimeUnit.SECONDS)//连接时间 .readTimeout(ROConstants.timeout,TimeUnit.SECONDS)//读时间 .writeTimeout(ROConstants.timeout,TimeUnit.SECONDS);//写时间 } /** * 获取此单例类对象的方法 * */ public static RxAndroidOkhttp getInstance(){ if(null==mRxAndroidOkhttp){//单例对象为空 synchronized (RxAndroidOkhttp.class){ mRxAndroidOkhttp=new RxAndroidOkhttp(); } } return mRxAndroidOkhttp; } /** * get请求方法 * */ public Observable<String> get(final String url){ //创建被观察者 Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>(){ @Override public void call(Subscriber<? super String> subscriber) { final Subscriber mSubscriber=subscriber; //没有取消订阅的时候 if(!mSubscriber.isUnsubscribed()){ //get请求 Request request=new Request.Builder().url(url).get().build(); if(null!=mOkHttpClient){ mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //通知订阅者的错误信息 mSubscriber.onError(e); } @Override public void onResponse(Call call, Response response) throws IOException { if (null != response && response.isSuccessful()) { //通知订阅者的成功信息 mSubscriber.onNext(response.body().string()); } //通知完毕 mSubscriber.onCompleted(); } }); } } } }); return observable; } /** * post请求方法 * */ public Observable<String> post(final String url, final Map<String,String> params){ //创建被观察者 Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>(){ @Override public void call(Subscriber<? super String> subscriber) { final Subscriber mSubscriber=subscriber; //没有取消订阅的时候 if(!mSubscriber.isUnsubscribed()){ //获取FormBody.Builder 对象 FormBody.Builder builder=new FormBody.Builder(); //遍历params 将其放入到FormBody.Builder 对象 if(params!=null&&!params.isEmpty()){ for(Map.Entry<String, String> entry :params.entrySet()){ builder.add(entry.getKey(), entry.getValue()); } } //获取RequestBody 对象 RequestBody requestBody = builder.build(); //构建post请求 Request request=new Request.Builder().url(url).post(requestBody).build(); if(mOkHttpClient!=null){ mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //通知订阅者的错误信息 mSubscriber.onError(e); } @Override public void onResponse(Call call, Response response) throws IOException { if(null!=response&&response.isSuccessful()){ //通知订阅者的成功信息 mSubscriber.onNext(response.body().string()); } //通知完毕 mSubscriber.onCompleted(); } }); } } } }); return observable; } /** * 下载图片 * */ public Observable<byte[]> loadImageViewByUrl(final String url){ //创建被观察者 Observable<byte[]> observable=Observable.create(new Observable.OnSubscribe<byte[]>(){ @Override public void call(Subscriber<? super byte[]> subscriber) { final Subscriber mSubscriber=subscriber; //没有取消订阅的时候 if(!mSubscriber.isUnsubscribed()){ //网络请求请求 Request request=new Request.Builder().url(url).get().build(); if(null!=mOkHttpClient){ mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //通知订阅者的错误信息 mSubscriber.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) { mSubscriber.onNext(data); } } //通知完毕 mSubscriber.onCompleted(); } }); } } } }); return observable; }}
4.实现activity
package com.wjn.rxandroidokhttpdemo.activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import com.wjn.rxandroidokhttpdemo.R;import com.wjn.rxandroidokhttpdemo.utils.RxAndroidOkhttp;import java.util.HashMap;import java.util.Map;import rx.Observable;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private TextView gettextview; private TextView posttextview; private TextView loadimageviewtextview; private ImageView imageview; private TextView resulttextview; private RxAndroidOkhttp mRxAndroidOkhttp=null;//RxAndroidOkhttp对象 private Observable<String> mObservable=null;//get post 方式请求的Observable对象 private Observable<byte[]> mimgObservable=null;//下载图片的Observable private String geturl="http://fanyi.youdao.com/openapi.do?keyfrom=imoocdict123456&key=324273592&type=data&doctype=json&version=1.1&q=blue";//get方式的请求路径 private String posturl="http://fanyi.youdao.com/openapi.do";//post方式的请求路径 private String imageviewurl="http://upload.site.cnhubei.com/2016/0117/1453000952567.jpg";//下载图片的路径 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } /** * 初始化各种View的方法 * */ private void initView(){ gettextview= (TextView) findViewById(R.id.activity_main_gettextview); posttextview= (TextView) findViewById(R.id.activity_main_posttextview); loadimageviewtextview= (TextView) findViewById(R.id.activity_main_loadimageviewtextview); imageview= (ImageView) findViewById(R.id.activity_main_loadimageviewimageview); resulttextview= (TextView) findViewById(R.id.activity_mainresulttextview); gettextview.setOnClickListener(this); posttextview.setOnClickListener(this); loadimageviewtextview.setOnClickListener(this); mRxAndroidOkhttp=RxAndroidOkhttp.getInstance(); } /** * 各种点击事件的方法 * */ @Override public void onClick(View v) { switch (v.getId()){ case R.id.activity_main_gettextview://get方式获取数据 if(null!=mRxAndroidOkhttp){ resulttextview.setText("数据加载中..."); //observable定义被观察者 mObservable=mRxAndroidOkhttp.get(geturl); if(null!=mObservable){ //定义观察者 Subscriber<String> mSubscriber=new Subscriber<String>(){ @Override public void onCompleted() { Log.d("MainActivity","get----onCompleted方法!!!"); } @Override public void onError(Throwable e) { resulttextview.setText(e.getMessage()); Log.d("MainActivity","get----onError方法!!!e.toString()----:"+e.toString()); } @Override public void onNext(String s) { Log.d("MainActivity","get----onNext方法!!!s----:"+s); resulttextview.setText("get方式请求结果:\n"+s); } }; /** * 订阅者关联被观察者 * Schedulers.io()说明是输入输出的计划任务 * AndroidSchedulers.mainThread()说明订阅者是中ui主线程中执行 * */ mObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(mSubscriber); } } break; case R.id.activity_main_posttextview://post方式获取数据 if(null!=mRxAndroidOkhttp){ 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"); resulttextview.setText("数据加载中..."); //observable定义被观察者 mObservable=mRxAndroidOkhttp.post(posturl,params); if(null!=mObservable){ //定义观察者 Subscriber<String> mSubscriber=new Subscriber<String>(){ @Override public void onCompleted() { Log.d("MainActivity","post----onCompleted方法!!!"); } @Override public void onError(Throwable e) { resulttextview.setText(e.getMessage()); Log.d("MainActivity","post----onError方法!!!e.toString()----:"+e.toString()); } @Override public void onNext(String s) { Log.d("MainActivity","post----onNext方法!!!s----:"+s); resulttextview.setText("post方式请求结果:\n"+s); } }; /** * 订阅者关联被观察者 * Schedulers.io()说明是输入输出的计划任务 * AndroidSchedulers.mainThread()说明订阅者是中ui主线程中执行 * */ mObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(mSubscriber); } } break; case R.id.activity_main_loadimageviewtextview://下载图片 if(null!=mRxAndroidOkhttp){ loadimageviewtextview.setText("下载中..."); //observable定义被观察者 mimgObservable=mRxAndroidOkhttp.loadImageViewByUrl(imageviewurl); //定义观察者 Subscriber<byte[]> mSubscriber=new Subscriber<byte[]>(){ @Override public void onCompleted() { Log.d("MainActivity","loadimagview----onCompleted方法!!!"); } @Override public void onError(Throwable e) { loadimageviewtextview.setText(e.getMessage()); Log.d("MainActivity","loadimageview----onError方法!!!e.toString()----:"+e.toString()); } @Override public void onNext(byte[] bytes) { Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); if((null!=bitmap)&&(!bitmap.isRecycled())){ imageview.setImageBitmap(bitmap); } loadimageviewtextview.setText("下载图片"); } }; /** * 订阅者关联被观察者 * Schedulers.io()说明是输入输出的计划任务 * AndroidSchedulers.mainThread()说明订阅者是中ui主线程中执行 * */ mimgObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(mSubscriber); } break; } }}
希望对你有所帮助。。。
阅读全文
0 0
- RxJava+RxAndroid+OKHTTP实现get post 以及下载图片功能
- RxAndroid结合OkHttp实现图片下载、get、post请求
- RxJava大全以及RxAndroid
- iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传
- volley框架配合后端服务器实现get post请求以及图片的上传和下载
- 使用RxJava和RxAndroid封装RxBus,实现EventBus功能
- okHttp工具类,实现get和post
- RxAndroid组合Retrofit 实现文件上传 post get
- okHttp post&get请求
- okhttp get post请求
- OkHttp的get post 以及同步请求Demo
- rxandroid+okhttp下载并支持https
- Android okhttp+rxjava实现多文件下载和断点续传
- Android okhttp+rxjava实现多文件下载和断点续传
- Android okhttp+rxjava实现多文件下载和断点续传
- Android 单例模式 封装 Okhttp + RxJava 网络请求(get和post)
- libcurl post/get上传下载文件 以及断点下载(操作libcurl 实现断点下载(续点续传))
- RxJava RxAndroid Retrofit RxBus Dragger2 OkHttp MVP MVVM DataBinding
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L. The Heaviest Non-decreasing Subsequence Problem(最长非减子序列+思路)
- c#对时间的处理(待添加)
- eclise 部署web工程报 There are no resources that can be added or removed from the server. 解决办法
- 存储管理方法详解
- 【数据库设计】概念设计-数据库ER图基础概念
- RxJava+RxAndroid+OKHTTP实现get post 以及下载图片功能
- Frequent Subsets Problem 进制运算 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- 暗通道去雾算法 python实现
- kami
- LeetCode--Edit Distance
- Android常用的动画和小型代码理解
- ssh整合测试
- 一串数字分区间显示
- VS SDK更新问题(error MSB8036: 找不到 Windows SDK 版本10.0.14393.0)