2017-05-03 90 views
0

想要在android studio中使用rxjava进行翻新。事实上,我跟着这个https://code.tutsplus.com/tutorials/getting-started-with-retrofit-2--cms-27792教程 这是我做了一切:Android无法解析rxjava中的订阅方法

compile 'com.android.support:appcompat-v7:25.1.0' 
    compile 'com.android.support.constraint:constraint-layout:1.0.2' 
    testCompile 'junit:junit:4.12' 
    compile 'com.squareup.retrofit2:retrofit:2.2.0' 
    compile 'com.google.code.gson:gson:2.8.0' 
    compile 'com.squareup.retrofit2:converter-gson:2.2.0' 
    compile 'com.android.support:recyclerview-v7:25.1.0' 
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' 
    compile 'io.reactivex.rxjava2:rxjava:2.0.9' 
    compile 'io.reactivex:rxandroid:1.2.1' 
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 

,我开了改造客户端和接口订阅方法。它说,水湿地解决

mService.getAnswer().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<SOAnswersResponse>() { 
          @Override 
          public void onCompleted() { 

          } 

          @Override 
          public void onError(Throwable e) { 

          } 

          @Override 
          public void onNext(SOAnswersResponse soAnswersResponse) { 

          } 


     } 
     ); 

我进口这在我的主要活动:

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.DividerItemDecoration; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 

import android.widget.Toast; 

import com.example.android.stackoverflow.Data.Model.Item; 

import com.example.android.stackoverflow.Data.Model.SOAnswersResponse; 
import com.example.android.stackoverflow.Data.remote.ApiUtils; 
import com.example.android.stackoverflow.Data.remote.SOService; 


import java.util.ArrayList; 


import io.reactivex.schedulers.Schedulers; 
import io.reactivex.android.schedulers.AndroidSchedulers; 
import rx.Subscriber; 
+0

参考以下链接:http ://randomdotnext.com/retrofit-rxjava/ –

回答

1

Rxplanation

在教程中,您链接使用RxJava 1.在RxJava 2方法subscribe不接受Subscriber类实例作为参数。你必须使用:

上述所有运营商也有不带参数subscribe()方法。

清理工作

您的依赖某种混乱。我能想出的依赖最短名单是:

// Reactive extensions. 
compile 'io.reactivex.rxjava2:rxjava:2.1.0' 
compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 

// Networking. 
compile 'com.squareup.retrofit2:retrofit:2.2.0' 
compile 'com.squareup.retrofit2:converter-jackson:2.2.0' 
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' 

特别是,请不要使用RxAndroid两个不同版本或适配器,因为你已经完成:

compile 'io.reactivex:rxandroid:1.2.1' 
compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 

compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' 
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 

也不需要使用杰克沃顿的适配器,因为它已被弃用。广场已经准备适配器RxJava2:

compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' 

示例代码现在

,所有的设定时,领域模型可以看起来像:

package com.todev.rxretrofit; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonInclude; 

import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL; 

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonInclude(value = NON_NULL) 
class Song { 

    private String id; 

    private String title; 

    public String getId() { 
    return id; 
    } 

    public String getTitle() { 
    return title; 
    } 
} 

记住我用杰克逊(如使用恕我直言更简单)。不要犹豫,要使用GSON注释,但是你会不得不改变杰克逊依赖GSON并重新配置Retrofit服务实例构造。

简单的服务接口:

package com.todev.rxretrofit; 

import io.reactivex.Single; 
import java.util.Collection; 
import retrofit2.http.GET; 

interface CustomService { 

    @GET("songs") 
    Single<Collection<Song>> getAllSongs(); 
} 

而在去年(但并非最不重要)在活动使用(我包括故意的所有进口):

package com.todev.rxretrofit; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import io.reactivex.android.schedulers.AndroidSchedulers; 
import io.reactivex.annotations.NonNull; 
import io.reactivex.disposables.CompositeDisposable; 
import io.reactivex.functions.Consumer; 
import io.reactivex.schedulers.Schedulers; 
import java.util.Collection; 
import okhttp3.OkHttpClient; 
import retrofit2.Retrofit; 
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; 
import retrofit2.converter.jackson.JacksonConverterFactory; 

public class MainActivity extends AppCompatActivity { 

    private CustomService customService = new Retrofit.Builder() 
     .baseUrl("http://<api_address>:<api_port>/") 
     .addConverterFactory(JacksonConverterFactory.create()) 
     .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
     .client(new OkHttpClient.Builder().build()) 
     .build() 
     .create(CustomService.class); 

    private CompositeDisposable disposables = new CompositeDisposable(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    this.disposables.add(
     this.customService.getAllSongs() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(this.responseHandler, this.errorHandler)); 
    } 

    @Override 
    protected void onDestroy() { 
    this.disposables.dispose(); 
    super.onDestroy(); 
    } 

    private Consumer<Collection<Song>> responseHandler = new Consumer<Collection<Song>>() { 
    @Override 
    public void accept(Collection<Song> songs) throws Exception { 
     // TODO: Handle response. 
     for (Song song : songs) { 
     Log.d(this.getClass().getSimpleName(), String.valueOf(song)); 
     } 
    } 
    }; 

    private Consumer<Throwable> errorHandler = new Consumer<Throwable>() { 
    @Override 
    public void accept(@NonNull Throwable throwable) throws Exception { 
     // TODO: Handle error. 
     Log.d(this.getClass().getSimpleName(), throwable.getLocalizedMessage()); 
    } 
    }; 
} 

正如你可以看到我用Consumer秒。您也可以使用lambda表达式并使用类方法。

enter image description here

注意

在本例中使用

JSON文件由json-server从简单的文本文件送达:

[ 
    { 
    "id": 0, 
    "title": "Song of Fire and Ice" 
    }, 
    { 
    "id": 1, 
    "title": "The Hanging Tree" 
    } 
] 

邮政scriptum

记得要加上网PE rmission在您的清单:

<uses-permission android:name="android.permission.INTERNET"/> 

否则您将收到SocketException与原因:

android.system.ErrnoException:socket失败:EACCES(拒绝)