Android Kotlin retrofit2 網路請求學習獲取微博熱搜列表

chenfzz發表於2020-11-16

最近在學習Kotlin,由於公司的專案全都是java,所以自己動手擼了一個微博熱搜列表熟悉一下Kotlin網路請求模組,在此記錄一下。

廢話不多說,上程式碼。

首先匯入相關的庫

    // Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    // Retrofit和jxjava關聯
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
    // Retrofit使用Gson轉換
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    // RxJava
    implementation 'io.reactivex.rxjava2:rxjava:2.2.13'
    // RxAndroid
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    //glide
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    //BRVAH
    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'

然後再擼一個BaseActivity,這裡用一下DataBinding,省去findviewById。然後初始化OkHttpClient和Retrofit,資料來源這裡我使用的是天行資料,大家可以註冊一個,部分API每天100次免費呼叫。還有ApiService介面列表也新增一下,介面為 weibohot/index,Bean拿返回的Json生成一下。

open class BaseActivity<AB : ViewDataBinding> : AppCompatActivity() {
    lateinit var binding: AB
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    fun setLayout(activity: Activity, layoutId: Int) {
        binding = DataBindingUtil.setContentView(activity, layoutId);
    }

    fun showToast(msg: String) {
        Toast.makeText(applicationContext, msg, Toast.LENGTH_SHORT).show()
    }

    fun startActivity(clazz: Class<*>) {
        startActivity(Intent(this, clazz))
    }

    var client = OkHttpClient()
    var mRetrofit: Retrofit = Retrofit.Builder()
        .baseUrl(Constant.BASE_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build()

    val apiService: ApiService = mRetrofit.create(ApiService::class.java)
}
interface ApiService {
    @GET("weibohot/index")
    fun getWeiboHot(
        @Query("key") key: String?
    ): Call<WeiboHotBean>
}
object Constant {
    const val TIANAPI_KEY = "you_key"
    const val BASE_URL = "http://api.tianapi.com/txapi/"
}

然後開擼微博列表,使用BRVAH庫,把Adapter寫出來,itemView也很簡單,三個TextView,這裡就不放了。

class WeiboHotAdapter(layoutResId: Int) : BaseQuickAdapter<HotBean, BaseViewHolder>(layoutResId) {
    override fun convert(holder: BaseViewHolder, item: HotBean) {
        holder.setText(R.id.tv_num, (holder.adapterPosition + 1).toString())
            .setText(R.id.tv_name, item.hotword)
            .setText(R.id.tv_hot, item.hotwordnum)
    }
}

最後開發WeiboHotActivity,佈局就一個RecyclerView,沒啥好說的。初始化一下RecyclerView 與Adapter,然後直接使用BaseActivity 裡初始化好的 apiService.getWeiboHot ,入參填自己的key,在onResponse裡setAdapter即可。這裡點選事件對應的是直接跳轉微博,如何跳轉微博搜尋結果知道的老哥可以回覆一下。

class WeiboHotActivity : BaseActivity<ActivityWeiboBinding>() {
    lateinit var mAdapter: WeiboHotAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setLayout(this, R.layout.activity_weibo)

        title = "微博熱搜"

        binding.rv.layoutManager = LinearLayoutManager(binding.rv.context)
        binding.rv.itemAnimator = DefaultItemAnimator()
        mAdapter = WeiboHotAdapter(R.layout.item_weibo_hot)
        mAdapter.setOnItemClickListener() { adapter, view, position -> toWeibo() }

        apiService.getWeiboHot(Constant.TIANAPI_KEY)
            .enqueue(object : Callback<WeiboHotBean> {
                override fun onFailure(call: Call<WeiboHotBean>, t: Throwable) {
                    showToast(t.message.toString())
                }

                @SuppressLint("SetTextI18n")
                override fun onResponse(
                    call: Call<WeiboHotBean>,
                    response: Response<WeiboHotBean>
                ) {
                    response.body()?.newslist?.let {
                        mAdapter.setList(it)
                        binding.rv.adapter = mAdapter;
                    }
                }
            }
            )
    }

    fun toWeibo() {
        val intent = Intent()
        intent.action = Intent.ACTION_VIEW
        intent.addCategory("android.intent.category.DEFAULT")
        intent.data = Uri.parse("sinaweibo://splash")
        this.startActivity(intent)
    }
}

至此,大功告成,由於是練手的Kotlin專案,部分程式碼寫的不足的地方歡迎大家指正。

 

相關文章