初涉RxAndroid結合Glide實現多圖片載入操作
轉載請註明出處:王亟亟的大牛之路
本來周末就想發了然後各種拖拉就沒有然後了,那麽就今天早上寫吧,廢話不多開始正題
什麽是RxJava或者RxAndroid我就不多廢話了,理論知識一大堆人給我們做好了。僅僅要自己肯去看就能理解,我這裏直接給出傳送門:https://github.com/lzyzsd/Awesome-RxJava(非常豐富,看完就基本有概念了)
那麽問題來了,人家都解釋完了我幹嘛?實操個簡單的樣例吧。正好上周講了篇Glide的那麽這次就實踐下
效果圖:
我們點開App然後就是一個RecycleView裏面有一堆圖然後還有文字,文字是本地的,圖是網上下的。邏輯流程非常easy,來說一下怎麽實現的然後引出主角。
包結構:
GlideModuleConfig配置Glide
StatusBarCompat沈浸式菜單條實現(翔哥那扣來的,這個事實上可有可無主要默認的顏色太醜)
TestOBJ頁面對象的屬性模型(你也能夠不用,個人習慣)
然後就是業務實現的MainActivity和適配器DataAdapter了
我們一個一個類看先是GlideModuleConfig
/**
* Created by jiajiewang on 16/3/25.
*/
public class GlideModuleConfig implements GlideModule {
//在這裏創建設置內容,之前文章所提及的圖片質量就能夠在這裏設置
//還能夠設置緩存池參數什麽的
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//設置了默認圖片格式
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
//設置了緩存的位置
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,"MY_CACHE_LOCATION", 100*1024*1024 ));
}
//在這裏註冊ModelLoaders
@Override
public void registerComponents(Context context, Glide glide) {
}
}
這裏做一些配置工作,詳細幹什麽能夠看凝視
TestOBJ用於給RecycleView引用圖片地址和文字內容
public class TestOBJ {
public String imageUrl;
public String content;
}
翔哥那個類不解釋了,能夠自己去搜搜百度第一條就是。我們再來看看適配器
DataAdapter(重要步驟的解釋也在凝視裏了)
public class DataAdapter extends RecyclerView.Adapter {
Context context;
List<TestOBJ> testOBJs;
public DataAdapter(Context context) {
this.context = context;
}
//獲取布局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new DataViewHolder(view);
}
//詳細item的載入圖片填充數據
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
DataViewHolder dataViewHolder = (DataViewHolder) holder;
TestOBJ obj = testOBJs.get(position);
//先獲取上下文對象,再載入詳細的URL然後填充到控件裏去
Glide.with(holder.itemView.getContext()).load(obj.imageUrl).into(dataViewHolder.imageIV);
dataViewHolder.contentTV.setText(obj.content);
}
@Override
public int getItemCount() {
return testOBJs == null ? 0 : testOBJs.size();
}
//控件對象Holder
static class DataViewHolder extends RecyclerView.ViewHolder {
ImageView imageIV;
TextView contentTV;
public DataViewHolder(View itemView) {
super(itemView);
imageIV = (ImageView) itemView.findViewById(R.id.imageIV);
contentTV = (TextView) itemView.findViewById(R.id.contentTV);
}
}
//刷新數據用
public void updateData(List<TestOBJ> testOBJs) {
this.testOBJs = testOBJs;
notifyDataSetChanged();
}
}
數據層已經OK了,我們來看看業務層
public class MainActivity extends AppCompatActivity {
Toolbar toolBar;
RecyclerView recycleView;
DataAdapter dataAdapter;
//URL數據源
String data[] = {"http://hiphotos.baidu.com/zhixin/abpic/item/4651a712c8fcc3cea97dbce49045d688d53f206c.jpg"
, "http://pic.5442.com/2014/0930/06/5442.jpg",
"http://img5q.duitang.com/uploads/item/201410/22/20141022214043_5EEKH.thumb.224_0.jpeg",
"http://img5.duitang.com/uploads/item/201512/08/20151208163159_HGEM2.thumb.224_0.png",
"http://img4.duitang.com/uploads/item/201510/29/20151029224537_ijEKF.thumb.224_0.jpeg",
"http://img5.imgtn.bdimg.com/it/u=1230273521,1023320328&fm=21&gp=0.jpg"
};
//被觀察者
Observable observable = Observable.create(new Observable.OnSubscribe<List<TestOBJ>>() {
@Override
public void call(Subscriber<? super List<TestOBJ>> subscriber) {
subscriber.onNext(makeData());
subscriber.onCompleted();
}
});
//觀察者
Observer<List<TestOBJ>> observer = new Observer<List<TestOBJ>>() {
@Override
public void onCompleted() {
LogUtils.d("--->onCompleted");
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, "載入失敗", Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(List<TestOBJ> testOBJs) {
testOBJs.size();
LogUtils.d("--->onNext testOBJs.size() " + testOBJs.size());
//刷新數據
dataAdapter.updateData(testOBJs);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
logic();
setSupportActionBar(toolBar);
StatusBarCompat.compat(this, getResources().getColor(R.color.status_bar_color));
StatusBarCompat.compat(this);
}
private void init() {
LogUtils.d("--->init");
toolBar = (Toolbar) findViewById(R.id.toolBar);
recycleView = (RecyclerView) findViewById(R.id.recycleView);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
private void logic() {
LogUtils.d("--->logic");
dataAdapter = new DataAdapter(MainActivity.this);
recycleView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
recycleView.setAdapter(dataAdapter);
LogUtils.d("--->Glide.getPhotoCacheDir " + Glide.getPhotoCacheDir(MainActivity.this, "MY_CACHE_LOCATION"));
}
//制造數據
private List<TestOBJ> makeData() {
List<TestOBJ> list = new ArrayList<>();
TestOBJ testOBJ;
for (int k = 0; k < 5; k++) {
testOBJ = new TestOBJ();
testOBJ.content = "標題啊,你服不服 " + k + " 個 ";
testOBJ.imageUrl = data[k];
list.add(testOBJ);
}
LogUtils.d("--->list的長度等於 " + list.size());
return list;
}
@Override
protected void onPause() {
super.onPause();
//清除請求
Glide.clear(recycleView);
}
@Override
protected void onDestroy() {
super.onDestroy();
LogUtils.d("--->onDestroy");
//必須主線程使用
Glide.get(this).clearMemory();
//Glide.get(this).clearDiskCache(); 非主線程
}
}
解釋:
我們定義了一個觀察者和一個被觀察者然後自從
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
註冊的行為開始後,僅僅咬被觀察者一有風吹草動,觀察者的相關回調就會被觸發,我們來看下Log的打印順序
還是在一堆的Activity生命周期裏先跑在我們數據摸你的過程中看了可能我們Glide緩存的文件夾,跟我們的預設一致,接著就運行了 onNext再是onCompleted。由於沒出什麽意外也就沒刷出onError
/data/user/0/sample.wjj.rxandroidglidedemo/cache/MY_CACHE_LOCATION
源代碼地址:https://github.com/ddwhan0123/RxAndroidDemo
初涉RxAndroid結合Glide實現多圖片載入操作