RxJava再学习系列一(1)

文章讲述了如何在Android应用中使用Java和RxJava库处理网络请求,包括使用HttpURLConnection下载图片并异步更新UI。还介绍了使用Glide加载图片以及线程切换的最佳实践。
摘要由CSDN通过智能技术生成

new Thread(() -> {

try {

URL url = new URL(PATH);

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

httpURLConnection.setConnectTimeout(5000);

//设置请求方法

httpURLConnection.setRequestMethod(“GET”);

int responseCode = httpURLConnection.getResponseCode(); // 才开始 request

if (responseCode == HttpURLConnection.HTTP_OK) {

InputStream inputStream = httpURLConnection.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

Message message = handler.obtainMessage();

message.obj = bitmap;

handler.sendMessage(message);

}

} catch (Exception e) {

e.printStackTrace();

}

}).start();

}

private final Handler handler = new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(@NonNull Message msg) {

Bitmap bitmap = (Bitmap) msg.obj;

image.setImageBitmap(bitmap);

if (progressDialog != null) progressDialog.dismiss();

return false;

}

});

public void rxJavaDownloadImageAction(View view) {

// 起点

Observable.just(PATH) // 内部会分发 PATH Stirng // TODO 第二步

// TODO 第三步

.map(new Function<String, Bitmap>() {

@Override

public Bitmap apply(@NotNull String s) throws Exception {

Log.i(TAG, "apply: ");

URL url = new URL(PATH_RX);

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

httpURLConnection.setConnectTimeout(5000);

//设置请求方法

httpURLConnection.setRequestMethod(“GET”);

int responseCode = httpURLConnection.getResponseCode(); // 才开始 request

if (responseCode == HttpURLConnection.HTTP_OK) {

InputStream inputStream = httpURLConnection.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

return bitmap;

}

return null;

}

})

.subscribeOn(Schedulers.io()) //给上面代码分配异步线程

.observeOn(AndroidSchedulers.mainThread()) //给下面代码分配主线程

// 订阅 起点 和 终点 订阅起来

.subscribe(new Observer() {

@Override

public void onSubscribe(@NotNull Disposable d) {

Log.i(TAG, "onSubscribe: ");

// 预备 开始 要分发

// TODO 第一步

progressDialog = new ProgressDialog(DownloadActivity.this);

progressDialog.setTitle(“download run”);

progressDialog.show();

}

// TODO 第四步

// 拿到事件

@Override

public void onNext(@NotNull Bitmap bitmap) {

Log.i(TAG, "onNext: ");

ivGlide.setImageBitmap(bitmap);

}

@Override

public void onError(@NotNull Throwable e) {

}

// TODO 第五步

// 完成事件

@Override

public void onComplete() {

Log.i(TAG, "onComplete: ");

if (progressDialog != null)

progressDialog.dismiss();

}

});

}

}

1.4、布局


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”>

<Button

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:onClick=“downloadImageAction”

android:text=“传统方式下载图片功能” />

<Button

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:onClick=“rxJavaDownloadImageAction”

android:text=“RxJava方式下载图片功能” />

<ImageView

android:id=“@+id/image”

android:layout_width=“match_parent”

android:layout_height=“200dp” />

<ImageView

android:id=“@+id/iv_glide”

android:layout_width=“match_parent”

android:layout_height=“200dp” />

2、代码实战:封转线程切换


public class DownloadActivity extends AppCompatActivity {

// 打印logcat日志的标签

private static final String TAG = “DownloadActivity”;

// 网络图片的链接地址

private final static String PATH = “http://bpic.588ku.com/element_origin_min_pic/16/10/29/2ac8e99273bc079e40a8dc079ca11b1f.jpg”;

private final static String PATH_RX = “http://bpic.588ku.com/element_origin_min_pic/17/06/13/5c5a1442f0ec72e59829ee10d891f224.jpg%21r650”;

// 弹出加载框

private ProgressDialog progressDialog;

// ImageView控件,用来显示结果图像

private ImageView image;

private ImageView ivGlide;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_download);

image = findViewById(R.id.image);

ivGlide = findViewById(R.id.iv_glide);

// Glide.with(this).load(PATH).into(ivGlide);

}

// 零零散散 麻烦 思维

public void downloadImageAction(View view) {

progressDialog = new ProgressDialog(this);

progressDialog.setTitle(“下载图片中…”);

progressDialog.show();

new Thread(() -> {

try {

URL url = new URL(PATH);

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

httpURLConnection.setConnectTimeout(5000);

//设置请求方法

httpURLConnection.setRequestMethod(“GET”);

int responseCode = httpURLConnection.getResponseCode(); // 才开始 request

if (responseCode == HttpURLConnection.HTTP_OK) {

InputStream inputStream = httpURLConnection.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

Message message = handler.obtainMessage();

message.obj = bitmap;

handler.sendMessage(message);

}

} catch (Exception e) {

e.printStackTrace();

}

}).start();

}

private final Handler handler = new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(@NonNull Message msg) {

Bitmap bitmap = (Bitmap) msg.obj;

image.setImageBitmap(bitmap);

if (progressDialog != null) progressDialog.dismiss();

return false;

}

});

/**

  • 封装我们的操作

  • Upstream 上游

  • Downstream 下游

*/

public final static ObservableTransformer<UD, UD> rxud() {

return new ObservableTransformer<UD, UD>() {

@Override

public ObservableSource apply(Observable upstream) {

return upstream.subscribeOn(Schedulers.io()) // 给上面代码分配异步线程

.observeOn(AndroidSchedulers.mainThread()) // 给下面代码分配主线程;

.map(new Function<UD, UD>() {

@Override

public UD apply(UD ud) throws Exception {

Log.d(TAG, “apply: 我监听到你了,居然在执行”);

return ud;

}

});

// …

}

};

}

public void rxJavaDownloadImageAction(View view) {

// 起点

Observable.just(PATH) // 内部会分发 PATH Stirng // TODO 第二步

// TODO 第三步

.map(new Function<String, Bitmap>() {

@Override

public Bitmap apply(@NotNull String s) throws Exception {

Log.i(TAG, "apply: ");

URL url = new URL(PATH_RX);

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

httpURLConnection.setConnectTimeout(5000);

//设置请求方法

httpURLConnection.setRequestMethod(“GET”);

int responseCode = httpURLConnection.getResponseCode(); // 才开始 request

if (responseCode == HttpURLConnection.HTTP_OK) {

InputStream inputStream = httpURLConnection.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

return bitmap;

}

return null;

}

})

// 图片上绘制文字 加水印

.map(new Function<Bitmap, Bitmap>() {

@Override

public Bitmap apply(Bitmap bitmap) throws Exception {

Paint paint = new Paint();

paint.setTextSize(88);

paint.setColor(Color.RED);

return drawTextToBitmap(bitmap, “同学们大家好”, paint, 88, 88);

}

})

// 每次都写这个线程切换比较麻烦,可以考虑进行封装

// .subscribeOn(Schedulers.io()) //给上面代码分配异步线程

// .observeOn(AndroidSchedulers.mainThread()) //给下面代码分配主线程

// 替代上面两行代码

.compose(rxud())

// 订阅 起点 和 终点 订阅起来

.subscribe(new Observer() {

@Override

public void onSubscribe(@NotNull Disposable d) {

Log.i(TAG, "onSubscribe: ");

// 预备 开始 要分发

// TODO 第一步

progressDialog = new ProgressDialog(DownloadActivity.this);

progressDialog.setTitle(“download run”);

progressDialog.show();

总结

开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?

作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

960页全网最全Android开发笔记

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

[外链图片转存中…(img-5eViG1Gr-1714958229289)]

[外链图片转存中…(img-MQbWk9M8-1714958229291)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的 RxJava 示例: ```java import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; public class RxJavaDemo { public static void main(String[] args) { Observable<String> observable = Observable.just("Hello, World!"); Observer<String> observer = new Observer<String>() { @Override public void onSubscribe(Disposable d) { // 在订阅时被调用 System.out.println("onSubscribe"); } @Override public void onNext(String s) { // 当收到数据时被调用 System.out.println("onNext: " + s); } @Override public void onError(Throwable e) { // 当发生错误时被调用 System.out.println("onError: " + e.getMessage()); } @Override public void onComplete() { // 当完成时被调用 System.out.println("onComplete"); } }; observable.subscribe(observer); } } ``` 这个示例中,我们创建了一个简单的 Observable 对象,它只发射了一个字符串 "Hello, World!"。然后我们创建了一个 Observer 对象,它定义了在收到数据、发生错误或完成时的行为。最后,我们通过调用 `observable.subscribe(observer)` 来订阅 Observable。 运行这个示例,你将会看到以下输出: ``` onSubscribe onNext: Hello, World! onComplete ``` 这表明在订阅时,`onSubscribe` 被调用;然后收到了数据 "Hello, World!",`onNext` 被调用;最后,`onComplete` 被调用,表示完成了数据的发射过程。 请注意,这只是 RxJava 的一个简单示例,RxJava 还有很多更强大的操作符和功能可以使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值