欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā))

學(xué)習(xí)RxJava有一段時(shí)間了,一直在考慮怎么使用,如何在項(xiàng)目中合理運(yùn)用它。在android很多項(xiàng)目中,都會(huì)存在圖片上傳,下面我介紹如何用Rxjava異步上傳多張圖片。

澤庫(kù)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!

一,用到的框架

  compile 'top.zibin:Luban:1.0.9'//圖片壓縮
  compile 'org.xutils:xutils:3.3.34'//網(wǎng)絡(luò)請(qǐng)求
  compile 'io.reactivex:rxandroid:1.1.0'//rxandroid
  compile 'io.reactivex:rxjava:1.1.0'//rxjava

另外Rxjava與Lambda表達(dá)式非常契合,便引入了Lambda的配置,在gradle中需要支持java8的特性:

 jackOptions {
      enabled true
    }

compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
  }

初始化配置,在自己的Application的onCreate中需要初始化網(wǎng)絡(luò)請(qǐng)求框架,否定會(huì)無(wú)法進(jìn)行網(wǎng)絡(luò)請(qǐng)求。

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;
  }
}

二,圖片壓縮與上傳

這里為了演示用法與圖片上傳只是模擬請(qǐng)求所以手動(dòng)創(chuàng)建了三個(gè)數(shù)組用來(lái)緩存圖片選擇后和處理后的url。

 private List<String> mImageList;
  private List<String> mReduceImageList;
  private List<String> 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());
  }

圖片上傳大部分是根據(jù)拍照或者圖庫(kù)選擇的多張Uri地址,如果不進(jìn)行壓縮,圖片都是很大的,一般拍照的圖片都有幾百KB或者幾M,所以為了節(jié)省流量與服務(wù)器的承載負(fù)擔(dān),需要進(jìn)行壓縮。壓縮后的圖片大小僅在幾十KB左右。

/**
   * 根據(jù)uri查詢(xún)位置圖片
   *
   * @param selectedImage
   */
  private void sendPicByUri(Uri selectedImage) {
    Cursor cursor = getContentResolver().query(selectedImage, null, null,
        null, null);
    String st8 = "沒(méi)有找到圖片";
    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());
    }

  }

 /**
   * 壓縮圖片
   *
   * @param filePath
   */
  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);
  }

為了優(yōu)化代碼和這些耗時(shí)操作用到的RxJava,進(jìn)行異步處理,我們需要?jiǎng)?chuàng)建RxJava的寫(xiě)法:

 /**
   * 分發(fā)url 接收者
   */
  private Func1<List<String>, Observable<String>> mOneLetterFunc = Observable::from;
  private Action1<String> mImageUrlAction = s -> uploadImg(new File(s));
  private Action1<String> mAddContent = s -> sendPicByUri(Uri.parse(s));

 /**
   * 分發(fā)壓縮圖片
   */
  private void setImage() {
    Log.i(tag, "開(kāi)始分發(fā)獲取的url");
    Observable.just(mImageList)
        .subscribeOn(Schedulers.io()) // 指定 subscribe() 發(fā)生在 IO 線程
        .observeOn(AndroidSchedulers.mainThread())
        .flatMap(mOneLetterFunc)
        .subscribe(mAddContent);
  }

分發(fā)的同事會(huì)進(jìn)行異步網(wǎng)絡(luò)請(qǐng)求,進(jìn)行上傳圖片至服務(wù)器,并返回服務(wù)器所存儲(chǔ)的url圖片地址:

/**
   * 圖片上傳服務(wù)器
   *
   * @param file 文件
   */
  public void uploadImg(File file) {
    Log.i(tag, "網(wǎng)絡(luò)請(qǐng)求上傳圖片");
    RequestParams params = new RequestParams("這里是上傳到服務(wù)器的Http地址");
    params.addBodyParameter("imgContent", file);
    params.setMultipart(true);
    x.http().post(params, new Callback.ProgressCallback<String>() {
      @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("上傳出錯(cuò)==", ex.getMessage());

      }

      @Override
      public void onCancelled(CancelledException cex) {
      }

      @Override
      public void onFinished() {

      }
    });
  }

為了節(jié)約時(shí)間,也可以在添加圖片時(shí)就進(jìn)行壓縮圖片等操作。上傳時(shí),只進(jìn)行上傳的網(wǎng)絡(luò)操作

 /**
   * 直接上傳所選圖片圖片
   */
  private void uploadingImage() {
    Log.i(tag, "開(kāi)始上傳圖片");
    if (mReduceImageList.size() > 0) {
      Observable.just(mReduceImageList)
          .subscribeOn(Schedulers.io()) // 指定 subscribe() 發(fā)生在 IO 線程
          .observeOn(AndroidSchedulers.mainThread())
          .flatMap(mOneLetterFunc)
          .subscribe(mImageUrlAction);
    }

  }

三,小結(jié)

這里只是簡(jiǎn)單的演示Rxjava的基本用法,其強(qiáng)大毋庸置疑,但要運(yùn)用好,還需要深入去學(xué)習(xí)它。它也讓我們的代碼更簡(jiǎn)潔。學(xué)習(xí)永無(wú)止境,感謝大佬們給我們提供的那么多好用的框架。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

分享標(biāo)題:Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā))
文章源于:http://chinadenli.net/article12/jhjegc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站定制開(kāi)發(fā)服務(wù)器托管品牌網(wǎng)站建設(shè)小程序開(kāi)發(fā)虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名