Как правильно показывать индикатор выполнения при использовании RecyclerView? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть действие, которое ожидает загрузки некоторых данных. Пока данные не были загружены, был показан индикатор выполнения. Когда данные загружаются, изображение исчезает.

У меня есть несколько асинхронных c задач, которые предназначены для:

DummyTask: запустите DownloadTask, затем после выполнения: заполните RecyclerView и скройте индикатор выполнения.

DownloadTask: скачать откуда-нибудь данные. затем верните его.

Однако программа зависает при выполнении второй асинхронной c задачи (DownloadTask).

Я не могу объединить Задачи, как вы предлагаете. Поскольку DummyTask зависит от RecyclerView. DownloadTask предназначен только для скачивания материалов.

Как лучше всего это сделать?

Вот мой код:

public class CardActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

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

        progressBar = (ProgressBar)findViewById(R.id.progress_first);


        new DummyTask().execute("https://httpstat.us/200?sleep=10000");

    }


    public class DummyTask extends AsyncTask<String, Integer, String> {
        protected String doInBackground(String... params) {

            String param1 = params[0];


            // the program is stuck here
            String result = new Downloader(param1).Get();

            return result;
        }

        protected void onPostExecute(String result) {

            ArrayList<ItemViewModel> exampleList = new ArrayList<>();
            for(int i = 0; i <= 5; i++) {
                exampleList.add(new ItemViewModel(R.drawable.ic_launcher_background, "aaaa", "bbbb", "1.2"));
            }
            mRecyclerView = findViewById(R.id.recyclerView);
            progressBar.setVisibility(View.GONE);
            mRecyclerView.setVisibility(View.VISIBLE);


            mRecyclerView.setHasFixedSize(true);
            mLayoutManager = new LinearLayoutManager(CardActivity.this);
            mAdapter = new ItemViewAdapter(exampleList);
            mRecyclerView.setLayoutManager(mLayoutManager);
            mRecyclerView.setAdapter(mAdapter);


        }
    }

    public class Downloader{
        public String Url;
        public Downloader(String url){
            Url = url;
        }

        public String Get(){
            try {
                return new DownloadTask().execute().get();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "";
        }

        public class DownloadTask extends AsyncTask<String, Integer, String> {
            public String returned;
            protected String doInBackground(String... params) {

                String param1 = params[0];

                String url = param1;
                Response response = null;
                OkHttpClient client = new OkHttpClient.Builder()
                        .connectTimeout(30, TimeUnit.SECONDS)
                        .writeTimeout(30, TimeUnit.SECONDS)
                        .readTimeout(30, TimeUnit.SECONDS)
                        .build();

                Request request = new Request.Builder()
                        .url(url)

                        .build();


                try {
                    response = client.newCall(request).execute();
                } catch (IOException e) {
                    e.printStackTrace();
                }


                String responseBody = "";
                try {
                    responseBody = response.body().string();
                } catch (IOException e) {
                    responseBody = "Error";
                };
                returned = responseBody;
                return responseBody;
            }

            protected void onPostExecute(String result) {

            }
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...