我正在使用Volley从API获取数据并显示在回收器视图中并显示进度条直到数据未加载,现在问题是有时需要花费大量时间来获取数据并且它仍然显示进度条。我想要的是,如果它需要超过10秒,那么进度条应该停止并显示检查互联网连接与另一个布局上的重试按钮。
这是我的代码。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tab_one, container, false);
SharedPreferences sharedPref = getActivity().getSharedPreferences("country", Context.MODE_PRIVATE);
String country = sharedPref.getString("selectedCountry", "au");
progressBar = (ProgressBar) view.findViewById(R.id.pbFragOne);
listRecyclerView = (RecyclerView) view.findViewById(R.id.headlines_recycler);
RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
listRecyclerView.setLayoutManager(linearLayoutManager);
listRecyclerView.setItemAnimator(new DefaultItemAnimator());
listRecyclerView.setHasFixedSize(true);
latestNewsResponse();
return view;
}
public void latestNewsResponse() {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
String str_response = response.toString();
Gson gson = new Gson();
News news = gson.fromJson(str_response, News.class);
news_list = news.getArticles();
if (!news.getStatus().contentEquals("ok")) {
Toast.makeText(getContext(), "Check your connection", Toast.LENGTH_SHORT).show();
}
newsListAdapter = new NewsListAdapter(getContext(), news_list);
progressBar.setVisibility(View.GONE);
listRecyclerView.setAdapter(newsListAdapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(jsonObjectRequest);
}
如果使用Observable,只需创建Observable.interval
填充间隔和timeunit作为参数。
您可以使用HandlerThread类:https://developer.android.com/reference/android/os/HandlerThread
public void start10SecondsTimeout() {
final HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Looper looper = handlerThread.getLooper();
final Handler handler = new Handler(looper);
final Date initialTime = new Date();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Date currentTime = new Date();
long elapsed = currentTime.getTime() - initialTime.getTime();
if (elapsed > 10000) {
// update ui here
handler.removeCallbacks(this);
}
handler.postDelayed(this, 1000);
}
}, 1000);
}
此代码每秒运行一次,您可以自己选择HandlerThread的调度频率。