OkHttpClient加载图片给DisposableObserver,CompositeDisposable调度控制后台任务队列简单代码
来源:互联网 发布:淘宝卖家下架的宝贝在哪里 编辑:程序博客网 时间:2024/06/05 14:35
OkHttpClient加载图片给DisposableObserver,CompositeDisposable调度控制后台任务队列简单代码
实现一个简单的功能,点击按钮,触发OkHttpClient加载图片给DisposableObserver,然后刷新ListView。全程有CompositeDisposable控制任务队列。
布局文件:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮" /> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
Java代码:
package zhangphil.app;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.support.annotation.LayoutRes;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.ListView;import java.util.ArrayList;import java.util.UUID;import java.util.concurrent.Callable;import io.reactivex.Observable;import io.reactivex.ObservableSource;import io.reactivex.android.schedulers.AndroidSchedulers;import io.reactivex.disposables.CompositeDisposable;import io.reactivex.observers.DisposableObserver;import io.reactivex.schedulers.Schedulers;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MainActivity extends Activity { private final String TAG = String.valueOf(UUID.randomUUID()); private ArrayList mItems = new ArrayList<>(); private ItemAdapter mAdapter; private OkHttpClient mOkHttpClient; private CompositeDisposable mCompositeDisposable = new CompositeDisposable(); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mOkHttpClient = new OkHttpClient(); mAdapter = new ItemAdapter(this, -1); ListView listView = (ListView) findViewById(R.id.listView); listView.setAdapter(mAdapter); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String url = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg"; addItems(url); } }); } private void addItems(final String url) { DisposableObserver disposableObserver = new DisposableObserver<Bitmap>() { @Override public void onNext(@NonNull Bitmap bmp) { Log.d(TAG, "onNext"); mItems.add(bmp); } @Override public void onComplete() { Log.d(TAG, "onComplete"); mAdapter.notifyDataSetChanged(); } @Override public void onError(Throwable e) { Log.e(TAG, e.toString(), e); } }; /** * 注意此处的写法! */ mCompositeDisposable.add( getBitmapObservable(url) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(disposableObserver) ); } /** * 以下是常规的Android ListView数据添加和更新Adapter */ private class ItemAdapter extends ArrayAdapter { private Context context; public ItemAdapter(@NonNull Context context, @LayoutRes int resource) { super(context, resource); this.context = context; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { ImageView imageView = new ImageView(context); imageView.setImageBitmap(getItem(position)); return imageView; } @Nullable @Override public Bitmap getItem(int position) { Bitmap bmp = (Bitmap) mItems.get(position); return bmp; } @Override public int getCount() { return mItems.size(); } } @Override protected void onDestroy() { super.onDestroy(); //取消所有Okhttp的网络请求 mOkHttpClient.dispatcher().cancelAll(); //如果退出程序,就清除后台任务 mCompositeDisposable.clear(); } private Observable<Bitmap> getBitmapObservable(@NonNull final String url) { return Observable.defer(new Callable<ObservableSource<Bitmap>>() { @Override public ObservableSource<Bitmap> call() throws Exception { Thread.sleep(5000); Bitmap bmp = null; //同步方法返回观察者需要的数据结果 //在这里处理线程化的操作 Request request = new Request.Builder().url(url).build(); Response response = mOkHttpClient.newCall(request).execute(); try { if (response.isSuccessful()) { byte[] bytes = response.body().bytes(); bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } } catch (Exception e) { e.printStackTrace(); } Log.d(TAG, "数据正确"); return Observable.just(bmp); } }); }}
0 0
- OkHttpClient加载图片给DisposableObserver,CompositeDisposable调度控制后台任务队列简单代码
- 简单 任务调度 任务池
- ios和安卓给后台上传图片代码
- OKhttpClient 简单使用总结
- Android后台调度任务与省电
- STM32 简单多任务调度
- STM32 简单多任务调度
- Android 源码解析: 图片加载库Picasso 4 任务调度 Dispatcher
- querytz任务调度的代码
- OpenMP编程的任务调度控制
- OKHttpClient简单使用工具类
- 分布式任务队列与任务调度系统Celery入门
- 分布式后台任务队列模拟(Golang)
- Android后台任务队列类库
- OKHttpClient
- OkHttpClient
- OkHttpClient
- 异步任务加载网络图片
- HTML5之arcTo()函数
- Token相关
- [Android]实现高德地图导航
- JPush:引用library/.aar文件的JPush
- 第一单元
- OkHttpClient加载图片给DisposableObserver,CompositeDisposable调度控制后台任务队列简单代码
- 7.scala面向对象2
- dubbo rpc服务使用
- 29行代码搞定批量自定义创建用户,并生成日志
- MTK Kernel启动流程源码解析 3 init_task
- 已解决:Android Studio Error:Connection timed out: connect
- 一篇SSM框架整合友好的文章(二)
- BLE 绑定流程
- flume将log4j日志数据写入到hdfs