Я сделал парсер веб-страниц для своего андроид приложения, и он нормально работает, но через некоторое время вылетает. Ошибку вызывает блок кода, отвечающий за открытие ссылки и получение URL'а картинки оттуда, и я не могу понять, в чём проблема.
Картинки есть во всех новостях, которые он парсит, но он чем то недоволен. Как решить эту проблему? Код и логи прилагаю ниже:
MainActivity.class:
public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
MyRecyclerViewAdapter adapter;
public Elements content;
public ArrayList<String> titleList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new NewThread().execute();
new NewThread().execute();
RecyclerView recyclerView = findViewById(R.id.rv_list);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new MyRecyclerViewAdapter(this, titleList);
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, Void, String> {
String cleaner(String a){
String source = a;
String result = "";
ArrayList<String> arr = new ArrayList<>();
arr.add(source);
for(String retrival: source.split(" ")){
arr.add(retrival);
}
arr.remove(0);
Iterator<String> iterator = arr.iterator();
while (iterator.hasNext()) {
String string = iterator.next();
if (string.equals("Россия") || string.equals("Екатеринбург")) {
iterator.remove();
}else{
result += string+" ";
}
}
return result;
}
@Override
protected String doInBackground(String... arg) {
Document doc;
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;
titleList.clear();
for(Element contents: content){
titleList.add(cleaner(contents.text()));
String href = doc.getElementsByClass("pub").get(link_counter).attr("href");
// Log.d("parse", href);
String region = doc.getElementsByClass("region").get(link_counter).text();
// Log.d("Title", region);
String time = doc.getElementsByTag("time").get(link_counter).attr("datetime");
// Log.d("Time", time);
//Блок кода ниже вызывает ошибку
Document doc2 = Jsoup.connect("https://www.znak.com"+href).get();
String pic_url=doc2.getElementsByTag("img").get(link_counter).attr("src");
Log.d("picture", pic_url+" "+contents.text());
link_counter++;
}
}catch (IOException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
adapter.notifyDataSetChanged();
}
}
}
Логи:
04-29 14:19:54.849 6443-6443/? I/zygote: Not late-enabling -Xcheck:jni (already on)
04-29 14:19:54.861 6443-6443/? W/zygote: Unexpected CPU variant for X86 using defaults: x86
04-29 14:19:55.090 6443-6443/com.example.max.recyclerviewtesting I/InstantRun: starting instant run server: is main process
04-29 14:19:55.323 6443-6461/com.example.max.recyclerviewtesting D/NetworkSecurityConfig: No Network Security Config specified, using platform default
04-29 14:19:55.337 6443-6465/com.example.max.recyclerviewtesting D/OpenGLRenderer: HWUI GL Pipeline
04-29 14:19:55.370 6443-6465/com.example.max.recyclerviewtesting I/zygote: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
04-29 14:19:55.370 6443-6465/com.example.max.recyclerviewtesting I/OpenGLRenderer: Initialized EGL, version 1.4
04-29 14:19:55.370 6443-6465/com.example.max.recyclerviewtesting D/OpenGLRenderer: Swap behavior 1
04-29 14:19:55.371 6443-6465/com.example.max.recyclerviewtesting W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
04-29 14:19:55.371 6443-6465/com.example.max.recyclerviewtesting D/OpenGLRenderer: Swap behavior 0
04-29 14:19:55.382 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglCreateContext: 0xa55af600: maj 3 min 0 rcv 3
04-29 14:19:55.407 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglMakeCurrent: 0xa55af600: ver 3 0 (tinfo 0xafdaa640)
04-29 14:19:55.452 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglMakeCurrent: 0xa55af600: ver 3 0 (tinfo 0xafdaa640)
04-29 14:19:56.102 6443-6448/com.example.max.recyclerviewtesting I/zygote: Do partial code cache collection, code=15KB, data=29KB
04-29 14:19:56.105 6443-6448/com.example.max.recyclerviewtesting I/zygote: After code cache collection, code=15KB, data=29KB
Increasing code cache capacity to 128KB
04-29 14:19:56.934 6443-6461/com.example.max.recyclerviewtesting D/picture: //img.znak.com/logo-200x96.png Екатеринбург Не забыли, понимаешь Музей Ельцина в Екатеринбурге — во всех смыслах удивительное место
04-29 14:19:56.942 6443-6448/com.example.max.recyclerviewtesting I/zygote: Do partial code cache collection, code=60KB, data=45KB
After code cache collection, code=60KB, data=45KB
Increasing code cache capacity to 256KB
04-29 14:19:57.690 6443-6461/com.example.max.recyclerviewtesting D/picture: //img.znak.com/1397932.jpg Екатеринбург Музей истории Екатеринбурга ищет «око Саурона» для Водонапорной башни на Плотинке
04-29 14:19:58.229 6443-6461/com.example.max.recyclerviewtesting D/picture: https://img.znak.com/1856629.jpg Екатеринбург В Екатеринбурге музей конструктивизма вынужден отдать часть своих площадей швейному цеху
04-29 14:19:58.673 6443-6461/com.example.max.recyclerviewtesting D/picture: Екатеринбург Музей Екатеринбурга раскрыл секрет памятника соратнику Ленина, расстрелявшему Николая II
04-29 14:20:01.250 6443-6461/com.example.max.recyclerviewtesting E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.max.recyclerviewtesting, PID: 6443
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.get(ArrayList.java:437)
at com.example.max.recyclerviewtesting.MainActivity$NewThread.doInBackground(MainActivity.java:117)
at com.example.max.recyclerviewtesting.MainActivity$NewThread.doInBackground(MainActivity.java:54)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
04-29 14:20:01.578 6443-6465/com.example.max.recyclerviewtesting D/EGL_emulation: eglMakeCurrent: 0xa55af600: ver 3 0 (tinfo 0xafdaa640)
04-29 14:20:02.211 6443-6472/com.example.max.recyclerviewtesting D/picture: //img.znak.com/logo-200x96.png Екатеринбург Не забыли, понимаешь Музей Ельцина в Екатеринбурге — во всех смыслах удивительное место
04-29 14:20:02.626 6443-6472/com.example.max.recyclerviewtesting D/picture: //img.znak.com/1397932.jpg Екатеринбург Музей истории Екатеринбурга ищет «око Саурона» для Водонапорной башни на Плотинке
04-29 14:20:05.327 6443-6472/com.example.max.recyclerviewtesting D/picture: https://img.znak.com/1856629.jpg Екатеринбург В Екатеринбурге музей конструктивизма вынужден отдать часть своих площадей швейному цеху
04-29 14:20:05.782 6443-6472/com.example.max.recyclerviewtesting D/picture: Екатеринбург Музей Екатеринбурга раскрыл секрет памятника соратнику Ленина, расстрелявшему Николая II
04-29 14:20:08.338 6443-6472/com.example.max.recyclerviewtesting I/Process: Sending signal. PID: 6443 SIG: 9
Огромное спасибо woesss'у, его идея была правильной. Вот как должен работать тот участок кода:
String pic_url=doc2.getElementsByTag("img").get(1).attr("src");
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
интересует возможность заполнение EditText'а по расположению курсора через buttonТо есть понятно что editText
Мне нужно из json достать строку из объекта из массива массивов(надеюсь правильно понимаю)Каким образом именно 7 индекс получить? желательно...
У меня не выходит вроде делаю все правильно, но компонент не видно
Изучаю OpenGL и столкнулся с необходимостью использовать sampler2DArrayВесь день мучаюсь - все без толку