java - Работа отдельного потока с Jsoup. Android


1

Был создан класс Parser,использующий Jsoup, который объединял в себе методы для парсинга значений с сайта. В обычной консоли все его методы работали прекрасно. Затем я перенёс этот класс в Android Studio для дальнейшего использования в приложении. Но в главном потоке нельзя взаимодействовать с интернетом поэтому я вынужден был перенести все использование Parser в новый поток:

class ProgressTask extends AsyncTask<Void,Void,Void>{

    @Override
    protected Void doInBackground(Void... voids) {
        title = Parser.getRandomStory("title");
        content = Parser.getRandomStory("story");
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        title_story.setText(title);
        content_story.setText(content);
    }
}

upd Код метода:

public static String getRandomStory(String value){
    String link = "https://pastach.ru/p/random";
    String title = "Title: ";
    String story = "Story: ";
    try {
        Document doc = Jsoup.connect(link).get();
        Element title_text = doc.getElementsByClass("header-title").get(0);
        title += title_text.text();
        Element story_text = doc.getElementsByClass("paste-content").get(0);
        story += story_text.text();
        //System.out.println(title);
        //System.out.println(story);
    } catch (IOException e) {
        return ("CONNECTION HAS BEEN LOST");
    }
    if(value.equals("story")){
        return story;
    }else{
        return title;
    }
}

upd2: логи:

07-22 20:38:01.768 24422-24422/com.example.len.coolstorybro E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.len.coolstorybro, PID: 24422 java.lang.NullPointerException: Attempt to invoke virtual method void android.widget.TextView.setText(java.lang.CharSequence) on a null object reference at com.example.len.coolstorybro.RandomStoryFragment$ProgressTask.onPostExecute(RandomStoryFragment.java:54) at com.example.len.coolstorybro.RandomStoryFragment$ProgressTask.onPostExecute(RandomStoryFragment.java:43) at android.os.AsyncTask.finish(AsyncTask.java:651) at android.os.AsyncTask.access$500(AsyncTask.java:180) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5927) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:958) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:819)

Но по каким то причинам переменный title и content всегда равны null. Что я делаю не так и как мне это исправить?

Источник
  •  37
  •  0
  • 22 янв 2018 2018-01-22 17:40:21
Но логи говорят, что именно в них проблема - сверяйте id в коде и xml. Или показывайте код и разметку активности. findViewById - надеюсь в onCreate после setContentView применили? — 22 янв 20182018-01-22 18:31:30.000000
Если onPostExecute - это единственное место где Вы их используете - то NullPointerException это не может вызывать. Скорее всего Вы не инициализировали переменные title_story / content_story до запуска таска. P.S. Всегда прикладывайте стектрейс ошибки к вопросу, если таковая имеется. — 22 янв 20182018-01-22 16:04:00.000000
@woesss В режиме отладки я увидел что они равны null. Это вызывает NullPointerException. Но я раскомментировал System.out.println и в консоль значения опять таки попали — 22 янв 20182018-01-22 14:39:07.000000
@woesss добавил в Upd — 22 янв 20182018-01-22 13:35:29.000000
Сеть есть. Разрешение в манифесте указано. Код метода сейчас предоставлю — 22 янв 20182018-01-22 13:28:31.000000

Ответов пока нет