栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android上传多张图片的实例代码(RxJava异步分发)

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android上传多张图片的实例代码(RxJava异步分发)

学习RxJava有一段时间了,一直在考虑怎么使用,如何在项目中合理运用它。在android很多项目中,都会存在图片上传,下面我介绍如何用Rxjava异步上传多张图片。

一,用到的框架

  compile 'top.zibin:Luban:1.0.9'//图片压缩
  compile 'org.xutils:xutils:3.3.34'//网络请求
  compile 'io.reactivex:rxandroid:1.1.0'//rxandroid
  compile 'io.reactivex:rxjava:1.1.0'//rxjava

另外Rxjava与Lambda表达式非常契合,便引入了Lambda的配置,在gradle中需要支持java8的特性:

 jackOptions {
      enabled true
    }

compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
  }

初始化配置,在自己的Application的onCreate中需要初始化网络请求框架,否定会无法进行网络请求。

public class APP extends Application {
  private static APP instance;
  public static synchronized APP getInstance() {
    return instance;
  }

  @Override
  public void onCreate() {
    super.onCreate();
    x.Ext.init(this);
    x.Ext.setDebug(org.xutils.BuildConfig.DEBUG);
    instance = this;
  }
}

二,图片压缩与上传

这里为了演示用法与图片上传只是模拟请求所以手动创建了三个数组用来缓存图片选择后和处理后的url。

 private List mImageList;
  private List mReduceImageList;
  private List mImageUrl;
 @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageUrl = new ArrayList<>();
    mImageList = new ArrayList<>();
    mReduceImageList = new ArrayList<>();
    mImageList.add("content://media/external/images/media/573778");
    mImageList.add("content://media/external/images/media/573778");
    mImageList.add("content://media/external/images/media/573778");
    Button button = (Button) findViewById(R.id.button1);
    button.setonClickListener(v -> setImage());
  }

图片上传大部分是根据拍照或者图库选择的多张Uri地址,如果不进行压缩,图片都是很大的,一般拍照的图片都有几百KB或者几M,所以为了节省流量与服务器的承载负担,需要进行压缩。压缩后的图片大小仅在几十KB左右。


  private void sendPicByUri(Uri selectedImage) {
    Cursor cursor = getContentResolver().query(selectedImage, null, null,
 null, null);
    String st8 = "没有找到图片";
    if (cursor != null) {
      cursor.moveToFirst();
      int columnIndex = cursor.getColumnIndex("_data");
      String picturePath = cursor.getString(columnIndex);
      cursor.close();

      if (picturePath == null || picturePath.equals("null")) {
 Toast toast = Toast.makeText(this, st8, Toast.LENGTH_SHORT);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();
 return;
      }
      sendPicture(picturePath);
    } else {
      File file = new File(selectedImage.getPath());
      if (!file.exists()) {
 Toast toast = Toast.makeText(this, st8, Toast.LENGTH_SHORT);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();
 return;

      }
      sendPicture(file.getAbsolutePath());
    }

  }

 
  private void sendPicture(final String filePath) {
    Log.i(tag, "压缩图片");
    Luban
 .get(this)
 .load(new File(filePath))
 .putGear(Luban.THIRD_GEAR)
 .setCompressListener(new onCompressListener() {
   @Override
   public void onStart() {
   }

   @Override
   public void onSuccess(File file) {
     Log.i(tag, "压缩后的图片==》");
     uploadImg(file);
   }

   @Override
   public void onError(Throwable e) {

   }
 })
 .launch();
    setResult(RESULT_OK);
  }

为了优化代码和这些耗时操作用到的RxJava,进行异步处理,我们需要创建RxJava的写法:


 
  private Func1, Observable> moneLetterFunc = Observable::from;
  private Action1 mImageUrlAction = s -> uploadImg(new File(s));
  private Action1 mAddContent = s -> sendPicByUri(Uri.parse(s));

 
  private void setImage() {
    Log.i(tag, "开始分发获取的url");
    Observable.just(mImageList)
 .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
 .observeOn(AndroidSchedulers.mainThread())
 .flatMap(mOneLetterFunc)
 .subscribe(mAddContent);
  }

分发的同事会进行异步网络请求,进行上传图片至服务器,并返回服务器所存储的url图片地址:


  public void uploadImg(File file) {
    Log.i(tag, "网络请求上传图片");
    RequestParams params = new RequestParams("这里是上传到服务器的Http地址");
    params.addBodyParameter("imgContent", file);
    params.setMultipart(true);
    x.http().post(params, new Callback.ProgressCallback() {
      @Override
      public void onWaiting() {
      }

      @Override
      public void onStarted() {
      }

      @Override
      public void onLoading(long total, long current, boolean isDownloading) {
      }

      @Override
      public void onSuccess(String result) {
 try {
   JSonObject jsonObject = new JSonObject(result);
   JSonObject data = jsonObject.getJSonObject("data");
   mImageUrl.add(data.getString("src"));
   if (mImageList.size() == mImageUrl.size()) {
     Log.i("上传完成==", mImageUrl.toString());
   }
 } catch (JSonException e) {
   e.printStackTrace();
 }

      }

      @Override
      public void onError(Throwable ex, boolean isOnCallback) {
 Log.i("上传出错==", ex.getMessage());

      }

      @Override
      public void onCancelled(CancelledException cex) {
      }

      @Override
      public void onFinished() {

      }
    });
  }

为了节约时间,也可以在添加图片时就进行压缩图片等操作。上传时,只进行上传的网络操作

 
  private void uploadingImage() {
    Log.i(tag, "开始上传图片");
    if (mReduceImageList.size() > 0) {
      Observable.just(mReduceImageList)
   .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
   .observeOn(AndroidSchedulers.mainThread())
   .flatMap(mOneLetterFunc)
   .subscribe(mImageUrlAction);
    }

  }

三,小结

这里只是简单的演示Rxjava的基本用法,其强大毋庸置疑,但要运用好,还需要深入去学习它。它也让我们的代码更简洁。学习永无止境,感谢大佬们给我们提供的那么多好用的框架。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/158229.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号