使用Rxjava 2和Retrofit 2无法加载数据时,应用程序崩溃

时间:2019-06-04 15:32:13

标签: android heroku retrofit2 rx-java2

我在我的应用程序中使用Retrofit2和rxjava2作为网络库。有时,当应用程序无法在活动中从服务器加载数据时会崩溃。我很想知道为什么会这样。

这是我的下面的代码:

ApiService.java

public interface ApiService {

@POST("retrofitUsers")
@FormUrlEncoded
Observable<String> saveData(@Field("name") String name,
                         @Field("age") String age);

@GET("getUsers")
Observable<List<BioData>> getData();

}

RetrofitClient.java

public class RetrofitClient {

private static Retrofit retrofit = null;

public static Retrofit getInstance(){

    if(retrofit == null)
        retrofit = new Retrofit.Builder()
                .baseUrl("https://bookbudiapp.herokuapp.com/")
                .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient().create()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

    return retrofit;

}

private RetrofitClient(){

}
}

BioData.java

public class BioData {

@SerializedName("name")
@Expose
private String name;

@SerializedName("age")
@Expose
private String age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAge() {
    return age;
}

public void setAge(String age) {
    this.age = age;
}
}

MainActivity.java

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

    recycle = findViewById(R.id.recycle);
    recycle.setHasFixedSize(true);
    recycle.setLayoutManager(new LinearLayoutManager(this));

    list  = new ArrayList<>();

    compositeDisposable = new CompositeDisposable();

    fetchData();
}

    private void fetchData(){

    Retrofit retrofit  = RetrofitClient.getInstance();
    ApiService myApi = retrofit.create(ApiService.class);

    Disposable disposable = myApi.getData().subscribeOn(Schedulers.io())
                                           .observeOn(AndroidSchedulers.mainThread())
                                           .subscribe(new Consumer<List<BioData>>() {
                                               @Override
                                               public void accept(List<BioData> bioData) throws Exception {

                                                   adapter = new UserAdapter(bioData,getApplicationContext());
                                                   recycle.setAdapter(adapter);
                                               }
                                           });



    compositeDisposable.add(disposable);

}

@Override
protected void onStop() {
    super.onStop();

   compositeDisposable.clear();

}
}

请让我知道我做错了。任何帮助将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:1)

几天前,我遇到了同样的问题,直到找到Free Dyno Hours,其中的解释是:

  

每个Heroku帐户都会分配一个免费的动态小时池。如果应用设置为使用免费测功并且以下任何一项为真,则该应用会主动消耗免费测功时数:

     

它具有可接收流量(即不睡觉)的网络测功机

     

它正在运行一个工人dyno

     

它具有一次性的测功机。例如,一个通过CLI或Scheduler启动。

这是什么意思?如果您使用的是Free account,并且在没有对Heroku网络服务器进行任何调用的情况下停留了一段时间,则它将休眠,一旦再次调用它,它将不会被唤醒。

有关更多信息,请阅读Heroku Dynos

我所做的是,创建一个OkHttpClient,如下所示:

private fun makeOkHttpClient(): OkHttpClient {
    return OkHttpClient.Builder()
        .connectTimeout(120, TimeUnit.SECONDS)
        .readTimeout(120, TimeUnit.SECONDS)
        .writeTimeout(90, TimeUnit.SECONDS)
        .build()
}

然后在您的Retrofit构建器中添加.client(makeOkHttpClient()),以便您可以分配readTimeoutwriteTimeout

我还建议您使用CompositeDisposable而不是Disposable,因为您只有一个电话,因此可以避免.add()的麻烦。