Android 如何修复';“表达式未使用”;这个::displayData“;在compositeDisposable.addAll(jsonApi.getData()';)中;?
我试图从API中获取一些数据,并使用改型和RxJava2显示这些数据。我是否正确使用CompositeDisposable.addall?当我说.subscribe{this::displayData}时,我指的是什么 因此,我尝试用.subscribe{cryptos->displayData(cryptos)}替换上面的.subscribe{…},但是遇到了编译时问题。我不知道当提到密码时我指的是什么。我以为这只是添加了“s”的模型类名(请不要问我为什么这么想)。我在.subscribe(订阅{this::displayData})中遇到的错误?是 retrocrypto0827\MainActivity.kt:(42,25):表达式未使用。我认为我没有正确引用接口。先谢谢你 MainActivity.ktAndroid 如何修复';“表达式未使用”;这个::displayData“;在compositeDisposable.addAll(jsonApi.getData()';)中;?,android,kotlin,android-recyclerview,retrofit2,rx-java2,Android,Kotlin,Android Recyclerview,Retrofit2,Rx Java2,我试图从API中获取一些数据,并使用改型和RxJava2显示这些数据。我是否正确使用CompositeDisposable.addall?当我说.subscribe{this::displayData}时,我指的是什么 因此,我尝试用.subscribe{cryptos->displayData(cryptos)}替换上面的.subscribe{…},但是遇到了编译时问题。我不知道当提到密码时我指的是什么。我以为这只是添加了“s”的模型类名(请不要问我为什么这么想)。我在.subscribe(订
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
}
}
修改客户端对象类
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>>
}
我希望它按照我在recyclerview中的顺序显示我正在使用的API中的数据。只需简单显示该数据。这是
消费者界面:
public interface Consumer<T> {
/**
* Consume the given value.
* @param t the value
* @throws Exception on error
*/
void accept(T t) throws Exception;
}
因此,::displayData
,该函数的引用未被使用
只需调用.subscribe{displayData(it)}
这里有一个关于高阶函数的好例子
啊,还有。。。正如提示一样,您可以通过使用lazy的以更简单、更惯用的方式将改型
实例创建为单例
object RetrofitClient {
val instance: Retrofit by lazy {
Retrofit.Builder()
.baseUrl("https://api.nomics.com/v1/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
再次感谢你。我能够重新组织一切,阅读更多关于高阶函数的知识,并理解更多。
class CryptoViewHolder(itemView: View):RecyclerView.ViewHolder(itemView)
{
val txtCurrency = itemView.txtCurrency
val txtPrice = itemView.txtPrice
}
public interface Consumer<T> {
/**
* Consume the given value.
* @param t the value
* @throws Exception on error
*/
void accept(T t) throws Exception;
}
.subscribe(
object : Consumer<List<Crypto>> {
override fun accept(t: List<Crypto>) {
::displayData
}
}
)
object RetrofitClient {
val instance: Retrofit by lazy {
Retrofit.Builder()
.baseUrl("https://api.nomics.com/v1/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}