Показать повтор и остановить индикатор выполнения через 10 секунд, если не удается получить данные - PullRequest
0 голосов
/ 12 сентября 2018

Я извлекаю данные из API, используя Volley, и показываю их в виде рециркулятора, показывая индикатор выполнения до тех пор, пока данные не будут загружены, теперь проблема в том, что иногда для извлечения данных требуется много времени, и показывая индикатор выполнения тоже. Я хочу, чтобы, если это заняло более 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);
}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете использовать класс 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.

0 голосов
/ 12 сентября 2018

Если вы используете Observable, просто создайте Observable.interval интервал заполнения и интервал времени в качестве параметра.

...