最近在写一个图片浏览的小软件,用来锻炼自己的,但是遇到一个问题,就是我爬的网站只有一个,图片更新很慢,所以我想多加几个网站作为我软件图片的来源,但是我无法把新建的类和之前的图片链接(获取图片链接再用Glide加载到ImageView)请求类一起使用。本想着找些开源项目来看看别人怎么实现的,但是找了两天都没结果,所以想问问如何解决,给个思路,谢谢了 orz
最近在写一个图片浏览的小软件,用来锻炼自己的,但是遇到一个问题,就是我爬的网站只有一个,图片更新很慢,所以我想多加几个网站作为我软件图片的来源,但是我无法把新建的类和之前的图片链接(获取图片链接再用Glide加载到ImageView)请求类一起使用。本想着找些开源项目来看看别人怎么实现的,但是找了两天都没结果,所以想问问如何解决,给个思路,谢谢了 orz
使用rxjava吧
线程操作比较方便
package com.github.rxjavatest
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import com.bumptech.glide.Glide
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.BiFunction
class MainActivity : AppCompatActivity() {
lateinit var recyclerView: RecyclerView
val list = arrayListOf<String>()
val adapter = ImageAdapter(list)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = GridLayoutManager(this, 3)
recyclerView.adapter = adapter
initImage()
}
private fun initImage() {
val imageGetter = ImageGetter("http://588ku.com/beijing/0-0-pxnum-4-8-0-0-0-1/")
val imgOb = imageGetter.getImageObserable()
val imageGetter2 = ImageGetter("http://588ku.com/beijing/0-0-pxnum-4-8-0-0-0-2/")
val imgOb2 = imageGetter2.getImageObserable()
Observable.zip(imgOb, imgOb2, BiFunction<List<String>, List<String>, List<String>> { t1, t2 ->
val list = arrayListOf<String>()
list.addAll(t1)
list.addAll(t2)
list
}).observeOn(AndroidSchedulers.mainThread())
.subscribe {
list.addAll(it)
adapter.notifyDataSetChanged()
}
}
}
class ImageAdapter(val list: List<String>) : RecyclerView.Adapter<VH>() {
override fun onBindViewHolder(holder: VH?, position: Int) {
holder?.apply {
val src = list[position]
Glide
.with(itemView)
.load(src)
.into(img)
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): VH {
val view = LayoutInflater.from(parent?.context)?.inflate(R.layout.item_img, parent, false)
return VH(view)
}
override fun getItemCount(): Int {
return list.size
}
}
class VH(itemView: View?) : RecyclerView.ViewHolder(itemView) {
val img: ImageView by lazy { itemView!!.findViewById<ImageView>(R.id.iv_image) }
}
package com.github.rxjavatest
import android.annotation.SuppressLint
import android.util.Log
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import java.util.concurrent.Executors
/**
* Created by cai on 2018/2/12.
*/
class ImageGetter(var url: String) {
fun getImageObserable(): Observable<ArrayList<String>> {
return Observable
.create<Document> {
val doc = Jsoup.connect(url)
.get()
it.onNext(doc)
it.onComplete()
}
.subscribeOn(Schedulers.io())
.map {
it.select("div a img")
}
.map {
val list = arrayListOf<String>()
it.forEach {
val image = it.attr("data-original")
list.add(image)
}
list
}
.observeOn(AndroidSchedulers.mainThread())
}
@SuppressLint("SetJavaScriptEnabled")
companion object {
}
}
val Any.TAG
get() = this.javaClass.simpleName
fun Any.logger(msg: Any?) {
Log.i(TAG, msg.toString())
}
简单写了个demo
项目地址
这里用JSoup爬数据
然后Rxjava返回数据流处理结果的img src的集合的Observable
在实际Activity中同时获得两个Observable,使用zip操作符组合,然后在主线程中将图片添加到list
刷新adapter
使用Glide加载图片
3 回答798 阅读✓ 已解决
2 回答2.1k 阅读
2 回答924 阅读✓ 已解决
1 回答888 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
2 回答6.1k 阅读✓ 已解决
1 回答1.6k 阅读
其实我的问题应该是如何在多线程里返回数据