標籤:.com get user word parent option lca private 資料來源
轉載請註明出處:王亟亟的大牛之路
本來周末就想發瞭然後各種拖拉就沒有然後了,那麼就今天早上寫吧,廢話不多開始正題
什麼是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實現多圖片載入操作