代码之家  ›  专栏  ›  技术社区  ›  Farhana Naaz Ansari Jay Dwivedi

网络维护Kotlin的改造和Rxandroid除外

  •  0
  • Farhana Naaz Ansari Jay Dwivedi  · 技术社区  · 6 年前

    这个问题问了很多遍,但没有一个解决方案起作用。我不知道代码是怎么回事。总是显示 android.os.NetworkOnMainThreadException

    下面的代码是我的 ViewModel

    class MainActicityViewModel(val context: MainActivity) : BaseObservable() {
    
    val layoutManagerAppointment = LinearLayoutManager(context)
    private val appClient = Appclient().getClient(context)
    private val apiInterface = appClient.create(ApiInterface::class.java)
    var rcyAdapter: RcyAdapter? = null
    
    init {
        getList()
    }
    
    fun getList() {
        val observable = apiInterface.getUsers()
        observable.subscribeOn(Schedulers.io()) // i have also registerd for Schedulers.newThread()
    
        observable.observeOn(AndroidSchedulers.mainThread())
        observable.subscribeWith(object : DisposableObserver<ArrayList<Data>>() {
            override fun onComplete() {
                Toast.makeText(context, "onComplete", Toast.LENGTH_SHORT).show()
            }
    
            override fun onNext(t: ArrayList<Data>) {
    
                Log.e("SIZE", "" + t.size)
                Toast.makeText(context, "onNext", Toast.LENGTH_SHORT).show()
            }
    
            override fun onError(e: Throwable) {
                Toast.makeText(context, "onError", Toast.LENGTH_SHORT).show()
                Log.e("TAG ON ERROR", "" + e)
    
    
            }
    
        })
    }
    

    }

    下面的代码是 Retrofit Client class

    class Appclient {
    
    private var retrofit: Retrofit? = null
    private val baseUrl = "https://jsonplaceholder.typicode.com"
    
    fun getClient(context: Context): Retrofit {
        //Here a logging interceptor is created
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val client = OkHttpClient.Builder()
            .addInterceptor(interceptor).build()
    
        retrofit = Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(client)
            .build()
        return (retrofit)!!
    }}
    

    我的改装界面

    interface ApiInterface {
    @GET("/users")
    fun getUsers(): Observable<ArrayList<Data>>}
    

    这是 MainActivity

    class MainActivity : AppCompatActivity() {
    
    lateinit var vModel: MainActicityViewModel
    var mainBinding: ActivityMainBinding? = null
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mainBinding = DataBindingUtil.setContentView(this@MainActivity, R.layout.activity_main)
        vModel = MainActicityViewModel(this@MainActivity)
        mainBinding!!.viewModel = vModel
    }}
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Silambarasan Poonguti    6 年前

    试试这个…

    fun getList() {
        val observable:Observable<ArrayList<Data>>  = apiInterface.getUsers()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableObserver<ArrayList<Data>>() {
                override fun onComplete() {
                    Toast.makeText(context, "onComplete", Toast.LENGTH_SHORT).show()
                }
    
                override fun onNext(t: ArrayList<Data>) {
    
                    Log.e("SIZE", "" + t.size)
                    Toast.makeText(context, "onNext", Toast.LENGTH_SHORT).show()
                }
    
                override fun onError(e: Throwable) {
                    Toast.makeText(context, "onError", Toast.LENGTH_SHORT).show()
                    Log.e("TAG ON ERROR", "" + e)
                }
            })
        }
    

    当您执行RXJava操作时,Observable需要是链调用,因为Observable不是构建器模式。