android - 使用 Rxjava 2 和 Retrofit 2 加载数据失败时应用程序崩溃

标签 android heroku retrofit2 rx-java2

我在我的应用程序中使用retrofit2和rxjava2作为网络库。有时,当应用程序无法从 Activity 中的服务器加载数据时,它会崩溃。我很明白为什么会发生这种情况。

这是我的代码:

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();

}
}

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

谢谢

最佳答案

几天前我遇到了同样的问题,直到我发现这个 Free Dyno Hours ,其中解释:

Every Heroku account is allocated a pool of free dyno hours. An app actively consumes free dyno hours if the app is set to use free dynos and any of the following are true:

It has a web dyno that is receiving traffic (i.e., not sleeping)

It has a worker dyno running

It has a one-off dyno running. For example, one started via the CLI or Scheduler.

这是什么意思?如果您使用的是免费帐户,并且您停留一段时间而没有对您的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 .

此外,我建议您使用 Disposable 而不是 CompositeDisposable,因为您只有一次调用,这样您就可以避免 .add() 东西。

关于android - 使用 Rxjava 2 和 Retrofit 2 加载数据失败时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56447043/

相关文章:

android - 始终隐藏 Xamarin Forms Android 输入控件的键盘(条形码扫描仪输入)

android - 触摸外部时关闭弹出窗口

javascript - 排除 Rails 部署的 Heroku ExecJS 程序错误

使用 Retrofit2 调用 Android 单元测试 API

android - : Lcom/google/devtools/build/android/desugar/runtime/ThrowableExtension; 解析失败

java - java中的枚举声明

android - Android内核源代码的git repo在哪里?

ruby-on-rails - 如何解决 Rails 应用程序启动时的内存膨胀问题?

ruby-on-rails - Rails 的 bundle install 导致我们所有的 bin 目录内容被覆盖

java - 改造 Https 调用给连接重置