Страницы

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

вторник, 16 апреля 2019 г.

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

В моей программе есть блок кода, отвечающий за открытие новостной статьи и извлечение из неё адреса картинки. Этот блок кода находится в потоке, отвечающем за работу с сетью и получение списка новостей. Когда они работают вместе, та программа сперва загружает всё, и отображает содержимое лишь секунд через 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; i String intTime = String.valueOf(timeArr[0])+String.valueOf(timeArr[1]); int timeValue = Integer.valueOf(intTime)+5;
if(timeValue>23){ 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; }
} }
}


Ответ

Попробуйте уведомлять адаптер не по окончании разбора всех новостей, а после добавления в список каждой:
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(); }

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

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