RXJava思维下载图片
目录
为什么要学习RxJava?
-
改变思维(响应式编程思想),编程效率提升
官网:ReactiveX
什么是响应式编程?
【根据上一层的响应,来影响下一层的变化】
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播
RXJava思维下载图片
第一步:加入依赖包
-
//RxAndroid的依赖包
-
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
-
//RxJava的依赖包
-
implementation 'io.reactivex.rxjava2:rxjava:2.0.7'
第二步:开启网络权限
-
<!--开启网络权限-->
-
<uses-permission android:name="android.permission.INTERNET"/>
第三步:页面布局
-
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
xmlns:tools="http://schemas.android.com/tools"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
tools:context=".MainActivity"
-
android:orientation="vertical">
-
-
<!--下载图片-->
-
<Button
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:text="下载图片"
-
android:onClick="loadDownImage" />
-
-
<!--Rxjava来显示图片-->
-
<ImageView
-
android:id="@ id/image"
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"/>
-
</LinearLayout>
第四步:RXJava下载/显示图片(MainActivity代码)
-
package com.example.rxjavastudy;
-
import androidx.appcompat.app.AppCompatActivity;
-
import android.annotation.SuppressLint;
-
import android.app.ProgressDialog;
-
import android.graphics.Bitmap;
-
import android.graphics.BitmapFactory;
-
import android.graphics.Canvas;
-
import android.graphics.Paint;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.widget.ImageView;
-
import java.io.InputStream;
-
import java.net.HttpURLConnection;
-
import java.net.URL;
-
import io.reactivex.Observable;
-
import io.reactivex.Observer;
-
import io.reactivex.android.schedulers.AndroidSchedulers;
-
import io.reactivex.disposables.Disposable;
-
import io.reactivex.functions.Function;
-
import io.reactivex.schedulers.Schedulers;
-
-
public class MainActivity extends AppCompatActivity {
-
-
//网络图片的链接地址
-
private final String PATH = "https://image.百度.com/search/down?tn=download&word=download&ie=utf8&fr"
-
"=detail&url=https://gimg2.百度.com/image_search/src=http%3A%2F%2Fpic1.win4000."
-
"com%2Fwallpaper%2F7%2F57ec72987b140.jpg&refer=http%3A%2F%2Fpic1.win4000.com&ap"
-
"p=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1663469947&t=f1"
-
"cb7822473a7224f3ae863f7d7082ee&thumburl=https://img2.百度.com/it/u=791640261,44080610%"
-
"26fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800";
-
-
//弹出加载框(正在加载中.....)
-
private ProgressDialog progressDialog;
-
-
//ImageView控件,用来显示图片
-
private ImageView image;
-
-
-
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
//初始化ImageView
-
image=findViewById(R.id.image);
-
-
}
-
-
public void loadDownImage(View view) {
-
//起点-创建被观察者 通过just完成起点流向终点的操作
-
//TODO 第二步
-
Observable.just(PATH)
-
//需求 1:图片下载
-
//TODO 第三步
-
.map(new Function<String, Bitmap>() {
-
-
public Bitmap apply(String s) throws Exception {
-
try {
-
Thread.sleep(2000);//睡眠2s
-
-
URL url=new URL(PATH);//url
-
//请求服务器
-
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
-
httpURLConnection.setConnectTimeout(5000);//设置请求时间为5s
-
-
//拿到服务器的响应码
-
int responseCode = httpURLConnection.getResponseCode();
-
if(responseCode==HttpURLConnection.HTTP_OK){//如果拿到200
-
InputStream inputStream=httpURLConnection.getInputStream();//获取输入流
-
Bitmap bitmap= BitmapFactory.decodeStream(inputStream);//解析输入流
-
return bitmap;
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return null;
-
}
-
})
-
//需求2:给图片加水印
-
//TODO 第四步
-
.map(new Function<Bitmap, Bitmap>() {
-
-
-
public Bitmap apply(Bitmap bitmap) throws Exception {
-
Paint paint=new Paint();
-
paint.setColor(R.color.black);//颜色
-
paint.setTextSize(150);//文字大小
-
Bitmap bitmap1=drawTextToBitmap(bitmap,"这是一个水印",paint,100,150);
-
return bitmap1;
-
}
-
})
-
//需求3:打印日志
-
//TODO 第五步
-
.map(new Function<Bitmap, Bitmap>() {
-
-
public Bitmap apply(Bitmap bitmap) throws Exception {
-
System.out.println("日志:" bitmap);
-
return bitmap;
-
}
-
})
-
-
//给上面的分配异步线程
-
.subscribeOn(Schedulers.io())
-
-
//图片显示终点分配andorid主线程
-
.observeOn(AndroidSchedulers.mainThread())
-
-
//TODO 导火索 点燃了 开始执行
-
//关联起点和终点 创建观察者,并进行订阅
-
.subscribe(new Observer<Bitmap>() {
-
-
-
//终点-订阅成功
-
//TODO 第一步
-
public void onSubscribe(Disposable d) {
-
//显示加载框
-
progressDialog = new ProgressDialog(MainActivity.this);
-
progressDialog.setTitle("图片正在加载中...");
-
progressDialog.show();
-
}
-
-
-
//上一层给的响应
-
//TODO 第六步
-
public void onNext(Bitmap bitmap) {
-
//显示到控件上
-
image.setImageBitmap(bitmap);
-
}
-
-
-
//发生异常
-
public void onError(Throwable e) {
-
-
}
-
-
-
//链条结束
-
//TODO 第七步
-
public void onComplete() {
-
//隐藏加载框
-
if(progressDialog != null){
-
progressDialog.dismiss();
-
}
-
}
-
});
-
}
-
-
-
//水印
-
private final Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop){
-
Bitmap.Config bitmapConfig = bitmap.getConfig();
-
paint.setDither(true);//获得更清晰的图片采样
-
paint.setFilterBitmap(true);//过滤
-
if(bitmapConfig == null){
-
bitmapConfig = Bitmap.Config.ARGB_8888;
-
}
-
-
Bitmap bitmap1 = bitmap.copy(bitmapConfig, true);
-
Canvas canvas = new Canvas(bitmap1);
-
canvas.drawText(text,paddingLeft,paddingTop,paint);
-
return bitmap1;
-
}
-
-
-
-
}
第五步:效果
rxjava思维下载图片
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfkcie
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13