我在我的应用程序中使用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();
}
}
请让我知道我做错了。任何帮助将不胜感激。
谢谢
答案 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())
,以便您可以分配readTimeout
和writeTimeout
。
我还建议您使用CompositeDisposable
而不是Disposable
,因为您只有一个电话,因此可以避免.add()
的麻烦。