• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

RXJava思维下载图片

武飞扬头像
APDL_10
帮助1

目录

为什么要学习RxJava?

什么是响应式编程?

RXJava思维下载图片


为什么要学习RxJava?

  • 改变思维(响应式编程思想),编程效率提升

        官网:ReactiveX

什么是响应式编程?

【根据上一层的响应,来影响下一层的变化】

  响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播

RXJava思维下载图片

第一步:加入依赖包

  1.  
    //RxAndroid的依赖包
  2.  
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
  3.  
    //RxJava的依赖包
  4.  
    implementation 'io.reactivex.rxjava2:rxjava:2.0.7'

第二步:开启网络权限

  1.  
    <!--开启网络权限-->
  2.  
    <uses-permission android:name="android.permission.INTERNET"/>

第三步:页面布局

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:tools="http://schemas.android.com/tools"
  4.  
    android:layout_width="match_parent"
  5.  
    android:layout_height="match_parent"
  6.  
    tools:context=".MainActivity"
  7.  
    android:orientation="vertical">
  8.  
     
  9.  
    <!--下载图片-->
  10.  
    <Button
  11.  
    android:layout_width="wrap_content"
  12.  
    android:layout_height="wrap_content"
  13.  
    android:text="下载图片"
  14.  
    android:onClick="loadDownImage" />
  15.  
     
  16.  
    <!--Rxjava来显示图片-->
  17.  
    <ImageView
  18.  
    android:id="@ id/image"
  19.  
    android:layout_width="wrap_content"
  20.  
    android:layout_height="wrap_content"/>
  21.  
    </LinearLayout>
学新通

第四步:RXJava下载/显示图片(MainActivity代码)

  1.  
    package com.example.rxjavastudy;
  2.  
    import androidx.appcompat.app.AppCompatActivity;
  3.  
    import android.annotation.SuppressLint;
  4.  
    import android.app.ProgressDialog;
  5.  
    import android.graphics.Bitmap;
  6.  
    import android.graphics.BitmapFactory;
  7.  
    import android.graphics.Canvas;
  8.  
    import android.graphics.Paint;
  9.  
    import android.os.Bundle;
  10.  
    import android.view.View;
  11.  
    import android.widget.ImageView;
  12.  
    import java.io.InputStream;
  13.  
    import java.net.HttpURLConnection;
  14.  
    import java.net.URL;
  15.  
    import io.reactivex.Observable;
  16.  
    import io.reactivex.Observer;
  17.  
    import io.reactivex.android.schedulers.AndroidSchedulers;
  18.  
    import io.reactivex.disposables.Disposable;
  19.  
    import io.reactivex.functions.Function;
  20.  
    import io.reactivex.schedulers.Schedulers;
  21.  
     
  22.  
    public class MainActivity extends AppCompatActivity {
  23.  
     
  24.  
    //网络图片的链接地址
  25.  
    private final String PATH = "https://image.百度.com/search/down?tn=download&word=download&ie=utf8&fr"
  26.  
    "=detail&url=https://gimg2.百度.com/image_search/src=http%3A%2F%2Fpic1.win4000."
  27.  
    "com%2Fwallpaper%2F7%2F57ec72987b140.jpg&refer=http%3A%2F%2Fpic1.win4000.com&ap"
  28.  
    "p=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1663469947&t=f1"
  29.  
    "cb7822473a7224f3ae863f7d7082ee&thumburl=https://img2.百度.com/it/u=791640261,44080610%"
  30.  
    "26fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800";
  31.  
     
  32.  
    //弹出加载框(正在加载中.....)
  33.  
    private ProgressDialog progressDialog;
  34.  
     
  35.  
    //ImageView控件,用来显示图片
  36.  
    private ImageView image;
  37.  
     
  38.  
     
  39.  
    @Override
  40.  
    protected void onCreate(Bundle savedInstanceState) {
  41.  
    super.onCreate(savedInstanceState);
  42.  
    setContentView(R.layout.activity_main);
  43.  
    //初始化ImageView
  44.  
    image=findViewById(R.id.image);
  45.  
     
  46.  
    }
  47.  
     
  48.  
    public void loadDownImage(View view) {
  49.  
    //起点-创建被观察者 通过just完成起点流向终点的操作
  50.  
    //TODO 第二步
  51.  
    Observable.just(PATH)
  52.  
    //需求 1:图片下载
  53.  
    //TODO 第三步
  54.  
    .map(new Function<String, Bitmap>() {
  55.  
    @Override
  56.  
    public Bitmap apply(String s) throws Exception {
  57.  
    try {
  58.  
    Thread.sleep(2000);//睡眠2s
  59.  
     
  60.  
    URL url=new URL(PATH);//url
  61.  
    //请求服务器
  62.  
    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
  63.  
    httpURLConnection.setConnectTimeout(5000);//设置请求时间为5s
  64.  
     
  65.  
    //拿到服务器的响应码
  66.  
    int responseCode = httpURLConnection.getResponseCode();
  67.  
    if(responseCode==HttpURLConnection.HTTP_OK){//如果拿到200
  68.  
    InputStream inputStream=httpURLConnection.getInputStream();//获取输入流
  69.  
    Bitmap bitmap= BitmapFactory.decodeStream(inputStream);//解析输入流
  70.  
    return bitmap;
  71.  
    }
  72.  
    } catch (Exception e) {
  73.  
    e.printStackTrace();
  74.  
    }
  75.  
    return null;
  76.  
    }
  77.  
    })
  78.  
    //需求2:给图片加水印
  79.  
    //TODO 第四步
  80.  
    .map(new Function<Bitmap, Bitmap>() {
  81.  
    @SuppressLint("ResourceAsColor")
  82.  
    @Override
  83.  
    public Bitmap apply(Bitmap bitmap) throws Exception {
  84.  
    Paint paint=new Paint();
  85.  
    paint.setColor(R.color.black);//颜色
  86.  
    paint.setTextSize(150);//文字大小
  87.  
    Bitmap bitmap1=drawTextToBitmap(bitmap,"这是一个水印",paint,100,150);
  88.  
    return bitmap1;
  89.  
    }
  90.  
    })
  91.  
    //需求3:打印日志
  92.  
    //TODO 第五步
  93.  
    .map(new Function<Bitmap, Bitmap>() {
  94.  
    @Override
  95.  
    public Bitmap apply(Bitmap bitmap) throws Exception {
  96.  
    System.out.println("日志:" bitmap);
  97.  
    return bitmap;
  98.  
    }
  99.  
    })
  100.  
     
  101.  
    //给上面的分配异步线程
  102.  
    .subscribeOn(Schedulers.io())
  103.  
     
  104.  
    //图片显示终点分配andorid主线程
  105.  
    .observeOn(AndroidSchedulers.mainThread())
  106.  
     
  107.  
    //TODO 导火索 点燃了 开始执行
  108.  
    //关联起点和终点 创建观察者,并进行订阅
  109.  
    .subscribe(new Observer<Bitmap>() {
  110.  
     
  111.  
    @Override
  112.  
    //终点-订阅成功
  113.  
    //TODO 第一步
  114.  
    public void onSubscribe(Disposable d) {
  115.  
    //显示加载框
  116.  
    progressDialog = new ProgressDialog(MainActivity.this);
  117.  
    progressDialog.setTitle("图片正在加载中...");
  118.  
    progressDialog.show();
  119.  
    }
  120.  
     
  121.  
    @Override
  122.  
    //上一层给的响应
  123.  
    //TODO 第六步
  124.  
    public void onNext(Bitmap bitmap) {
  125.  
    //显示到控件上
  126.  
    image.setImageBitmap(bitmap);
  127.  
    }
  128.  
     
  129.  
    @Override
  130.  
    //发生异常
  131.  
    public void onError(Throwable e) {
  132.  
     
  133.  
    }
  134.  
     
  135.  
    @Override
  136.  
    //链条结束
  137.  
    //TODO 第七步
  138.  
    public void onComplete() {
  139.  
    //隐藏加载框
  140.  
    if(progressDialog != null){
  141.  
    progressDialog.dismiss();
  142.  
    }
  143.  
    }
  144.  
    });
  145.  
    }
  146.  
     
  147.  
     
  148.  
    //水印
  149.  
    private final Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop){
  150.  
    Bitmap.Config bitmapConfig = bitmap.getConfig();
  151.  
    paint.setDither(true);//获得更清晰的图片采样
  152.  
    paint.setFilterBitmap(true);//过滤
  153.  
    if(bitmapConfig == null){
  154.  
    bitmapConfig = Bitmap.Config.ARGB_8888;
  155.  
    }
  156.  
     
  157.  
    Bitmap bitmap1 = bitmap.copy(bitmapConfig, true);
  158.  
    Canvas canvas = new Canvas(bitmap1);
  159.  
    canvas.drawText(text,paddingLeft,paddingTop,paint);
  160.  
    return bitmap1;
  161.  
    }
  162.  
     
  163.  
     
  164.  
     
  165.  
    }
学新通

第五步:效果

rxjava思维下载图片

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkcie
系列文章
更多 icon
同类精品
更多 icon
继续加载