如何修复 'Expression is unused "this::displayData" in compositeDisposable.addAll(jsonApi.getData()'?

How to fix 'Expression is unused "this::displayData" in compositeDisposable.addAll(jsonApi.getData()'?

我正在尝试从 API 中获取一些数据并使用改造和 RxJava2 显示该数据。我使用 CompositeDisposable.addall 正确吗?当我说 .subscribe {this::displayData}) 时,我指的是什么?

所以我尝试用 .subscribe{cryptos->displayData(cryptos)} 替换上面的 .subscribe{...},但遇到了编译时问题。当提到密码时,我不知道我指的是什么。我认为这只是模型 class 名称加上 's'(请不要问我为什么这么想)。我遇到的错误 .subscribe {this::displayData})?是 retrocrypto0827\MainActivity.kt: (42, 25): 表达式未被使用。我认为我没有正确引用 INTERFACE。提前谢谢你

MainActivity.kt

    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.recyclerview.widget.LinearLayoutManager
    import com.example.retrocrypto0827.Adapter.CryptoAdapter
    import com.example.retrocrypto0827.Model.Crypto
    import com.example.retrocrypto0827.RetrofitClient.IMyApi
    import com.example.retrocrypto0827.RetrofitClient.RetrofitClient
    import io.reactivex.android.schedulers.AndroidSchedulers
    import io.reactivex.disposables.CompositeDisposable
    import io.reactivex.schedulers.Schedulers
    import kotlinx.android.synthetic.main.activity_main.*

    class MainActivity : AppCompatActivity() {


        internal lateinit var jsonApi: IMyApi
        internal var compositeDisposable: CompositeDisposable = 
        CompositeDisposable()


        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            // Init api
            val retrofit = RetrofitClient.instance
            jsonApi = retrofit.create(IMyApi::class.java)

            // View
            recycler_crypto.layoutManager = LinearLayoutManager(this)
            recycler_crypto.setHasFixedSize(true)
            fetchData()


        }

        private fun fetchData() {
            compositeDisposable.addAll(jsonApi.getData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe {this::displayData})
        }

        private fun displayData(cryptoList: List<Crypto>) {

            val adapter = CryptoAdapter(this, cryptoList)
            recycler_crypto.adapter = adapter

        }


    }

Crypto.kt

  data class Crypto(val currency: String, val price: String)

RetrofitClient 对象class

    import retrofit2.Retrofit
    import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
    import retrofit2.converter.gson.GsonConverterFactory

    object RetrofitClient {

        private var ourInstance: Retrofit?=null


        val instance: Retrofit
        get(){
            if(ourInstance == null){
                ourInstance = Retrofit.Builder()
                    .baseUrl("https://api.nomics.com/v1/")

     .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
            }
            return ourInstance!!
        }


    }

IMyApi 接口

    import com.example.retrocrypto0827.Model.Crypto
    import io.reactivex.Observable
    import retrofit2.http.GET

    interface IMyApi {

        @GET("prices?key=yourapikey")
        fun getData(): Observable<List<Crypto>>
    }

CryptoAdapter.kt

    class CryptoAdapter(internal val context: Context, internal val 
    postList: List<Crypto>)
        :RecyclerView.Adapter<CryptoViewHolder>()
    {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
    CryptoViewHolder {
            var itemView = LayoutInflater.from(parent.context)
                .inflate(R.layout.retro_coin_card, parent, false)
            return CryptoViewHolder(itemView)
        }

        override fun getItemCount(): Int {
            return postList.size
        }

        override fun onBindViewHolder(holder: CryptoViewHolder, position: 
     Int) {
            holder.txtCurrency.text = 
     postList[position].currency.toString()
            holder.txtPrice.text = postList[position].price.toString()
        }
    }

CryptoViewHolder

  class CryptoViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) 
  {

            val txtCurrency = itemView.txtCurrency
            val txtPrice = itemView.txtPrice
        }

我希望它显示我正在使用的 API 中的数据,这些数据是按照我将其放入回收站视图的顺序显示的。只是该数据的简单显示。

这是Consumer界面:

public interface Consumer<T> {
    /**
     * Consume the given value.
     * @param t the value
     * @throws Exception on error
     */
    void accept(T t) throws Exception;
}

.subscribe {this::displayData} 等同于:

.subscribe(
    object : Consumer<List<Crypto>> {
        override fun accept(t: List<Crypto>) {
             ::displayData
        }
    }
)

所以,::displayData,这是对函数的引用没有被使用。

只需调用 .subscribe { displayData(it) }

这是一个很好的 post 关于它的高阶函数。

Aaaand...正如提示,您可以使用 by lazy

以更简单和惯用的方式将 Retrofit 实例创建为单例
    object RetrofitClient {

        val instance: Retrofit by lazy {
            Retrofit.Builder()
                .baseUrl("https://api.nomics.com/v1/")

                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }
    }