如何修复"表达式未使用"this::displayData"复合Disposable.addAll(jsonApi.getData())"?



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

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

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)

改造客户端对象类

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) }即可。

这里有一篇关于它高阶函数的好文章。

啊...正如提示一样,您可以使用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()
}
}

最新更新