鍍金池/ 問(wèn)答/Android  Linux  網(wǎng)絡(luò)安全/ Android 網(wǎng)絡(luò)請(qǐng)求問(wèn)題

Android 網(wǎng)絡(luò)請(qǐng)求問(wèn)題

最近在寫(xiě)一個(gè)圖片瀏覽的小軟件,用來(lái)鍛煉自己的,但是遇到一個(gè)問(wèn)題,就是我爬的網(wǎng)站只有一個(gè),圖片更新很慢,所以我想多加幾個(gè)網(wǎng)站作為我軟件圖片的來(lái)源,但是我無(wú)法把新建的類(lèi)和之前的圖片鏈接(獲取圖片鏈接再用Glide加載到ImageView)請(qǐng)求類(lèi)一起使用。本想著找些開(kāi)源項(xiàng)目來(lái)看看別人怎么實(shí)現(xiàn)的,但是找了兩天都沒(méi)結(jié)果,所以想問(wèn)問(wèn)如何解決,給個(gè)思路,謝謝了 orz

回答
編輯回答
念初

使用rxjava吧
線(xiàn)程操作比較方便

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())
}

簡(jiǎn)單寫(xiě)了個(gè)demo
項(xiàng)目地址

這里用JSoup爬數(shù)據(jù)
然后Rxjava返回?cái)?shù)據(jù)流處理結(jié)果的img src的集合的Observable

在實(shí)際Activity中同時(shí)獲得兩個(gè)Observable,使用zip操作符組合,然后在主線(xiàn)程中將圖片添加到list
刷新adapter

使用Glide加載圖片

2017年2月25日 06:00
編輯回答
無(wú)標(biāo)題

其實(shí)我的問(wèn)題應(yīng)該是如何在多線(xiàn)程里返回?cái)?shù)據(jù)

2018年5月29日 15:28
編輯回答
亮瞎她

把兩個(gè)類(lèi)合到一起,使用一個(gè)model就好了吧,這樣你可以請(qǐng)求到一個(gè)網(wǎng)站的數(shù)據(jù)add一次,然后notify一下

2017年7月3日 19:17