Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Как правильно вынести блок кода в поток

#java #android #многопоточность #android_asynctask


В моей программе есть блок кода, отвечающий за открытие новостной статьи и извлечение
из неё адреса картинки. Этот блок кода находится в потоке, отвечающем за работу с сетью
и получение списка новостей. Когда они работают вместе, та программа сперва загружает
всё, и отображает содержимое лишь секунд через 30. 

Как правильно реализовать функцию получения адреса картинки используя многопоточность?

Код MainActivity прикреплён ниже:

    public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {

    MyRecyclerViewAdapter adapter;

    public Elements content;
    public ArrayList newsList = new ArrayList<>();



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

        new NewThread().execute();
        RecyclerView recyclerView = findViewById(R.id.rv_list);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        adapter = new MyRecyclerViewAdapter(this, newsList);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row
number " + position, Toast.LENGTH_SHORT).show();
    }

    public class NewThread extends AsyncTask {

        String cleaner(String a){
            String source = a;
            String result = "";
            ArrayList arr = new ArrayList<>();
            arr.add(source);

            for(String retrival: source.split(" ")){
                arr.add(retrival);

            }
            arr.remove(0);
            Iterator iterator = arr.iterator();
            while (iterator.hasNext()) {
                String string = iterator.next();
                if (string.equals("Россия") || string.equals("Екатеринбург")) {
                    iterator.remove();
                }else{
                    result += string+" ";
                }
            }
            return result;
        }

        String url_interpretator(String src){
            String result="";
            String interval = "";

            char[] morph = src.toCharArray();
            morph[0]=' ';
            morph[1]=' ';

            for (char a : morph){
                if(a==' '){
                    continue;
                }else{
                    interval=interval+a;
                }
            }

            result="https://"+interval;

            return result;
        }
        @Override
        protected  String doInBackground(String... arg) {
            Document doc;
            String  newsText,  newsDate,  newsTime,  newsPicURL,  newsLink;

            try{
                doc= Jsoup.connect("https://www.znak.com/?&%D0%B5%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B1%D1%83%D1%80%D0%B3%20%D0%BC%D1%83%D0%B7%D0%B5").get();
                content = doc.select(".pub");

                int link_counter = 0;
                newsList.clear();
                for(Element contents: content){







                    String linkID = doc.getElementsByClass("pub").get(link_counter).attr("href");
                      String region = doc.getElementsByClass("region").get(link_counter).text();
                     String time = doc.getElementsByTag("time").get(link_counter).attr("datetime");





//                   Document doc2 = Jsoup.connect("https://www.znak.com"+href).get();
//                   String pic_url=url_interpretator(doc2.getElementsByTag("img").get(1).attr("src"));

                    DateAndTime dat = new DateAndTime(time);
                    newsText=" "+cleaner(contents.text());
                    newsDate=" "+dat.getYear()+" ";
                    newsTime=dat.getTime();

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    Document doc2 = null;                                       
                           //вынести в поток
                    try {
                        doc2 = Jsoup.connect("https://www.znak.com" + linkID).get();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    String pic_url = url_interpretator(doc2.getElementsByTag("img").get(1).attr("src"));
                    String readyURL = pic_url;
                    Log.d("picture", contents.text() + " " + pic_url);
                    newsPicURL=readyURL;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                    newsLink="https://znak.com"+linkID;
                    NewsElement newsElement = new NewsElement( newsText,  newsDate,
 newsTime,  newsPicURL,  newsLink);
                    newsList.add(newsElement);



                    link_counter++;
                }

            }catch (IOException e){

                e.printStackTrace();
            }

            return null;
        }


        @Override
        protected void onPostExecute(String result) {
            adapter.notifyDataSetChanged();
        }

    }

    private class DateAndTime{


        private String date;
        private String year;
        private String time="";
        private char[] timeArr;

        DateAndTime(String date){
            this.date=date;
        }

        String getYear(){


            String[] dateAndTime = date.split("T");
            String[] dateArr = dateAndTime[0].split("-");

            timeArr = dateAndTime[1].toCharArray();
            year = dateArr[2]+"."+dateArr[1]+"."+dateArr[0];

            return year;

        }


        String getTime(){

            for(int i = 0; i23){
                timeValue=timeValue-24;
                String time = "0"+String.valueOf(timeValue)+timeArr[2]+timeArr[3]+timeArr[4];
                return time;
            }else{
                String time = String.valueOf(timeValue)+timeArr[2]+timeArr[3]+timeArr[4];
                return time;
            }

        }
    }

}

    


Ответы

Ответ 1



Попробуйте уведомлять адаптер не по окончании разбора всех новостей, а после добавления в список каждой: public class NewThread extends AsyncTask { // --------------------- protected String doInBackground(String... arg) { // ---------------------- for(Element contents: content){ // ---------------------- newsList.add(newsElement); publishProgress(); // --------------------- } @Override protected void onProgressUpdate(Void... values) { adapter.notifyDataSetChanged(); }

Комментариев нет:

Отправить комментарий