В моей программе есть блок кода, отвечающий за открытие новостной статьи и извлечение из неё адреса картинки. Этот блок кода находится в потоке, отвечающем за работу с сетью и получение списка новостей. Когда они работают вместе, та программа сперва загружает всё, и отображает содержимое лишь секунд через 30.
Как правильно реализовать функцию получения адреса картинки используя многопоточность?
Код MainActivity прикреплён ниже:
public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
MyRecyclerViewAdapter adapter;
public Elements content;
public 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
for(String retrival: source.split(" ")){
arr.add(retrival);
}
arr.remove(0);
Iterator
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
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();
}
Комментариев нет:
Отправить комментарий