2016-04-30 2 views
1

Я пытаюсь загрузить таблицу данных с сайта, сохранить ее в ArrayList<String> и просмотреть ее на макете ListView. Каждый раз, когда я запускаю программу, я получаю эту ошибку.Android Studio - анализ с помощью jsoup throws error (java.lang.NullPointerException)

04-29 23:52:57.122 20095-20095/com.example.user.datamining E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.project.datamining, PID: 20095 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.datamining/com.example.user.DataMining}: java.lang.NullPointerException: Attempt to invoke virtual method 'org.jsoup.select.Elements org.jsoup.nodes.Document.select(java.lang.String)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2521) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595) 
at android.app.ActivityThread.access$800(ActivityThread.java:178) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5631) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'org.jsoup.select.Elements org.jsoup.nodes.Document.select(java.lang.String)' on a null object reference 

Это мой код:

package com.example.user.datamining; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.select.Elements; 

import java.io.IOException; 
import java.util.ArrayList; 

public class DataMining extends AppCompatActivity { 
    Document doc; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_data_mining); 

     Thread downloadThread = new Thread() { 
      public void run() { 

       try { 
        doc = Jsoup.connect("http://thewebsite.html").get(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     downloadThread.start(); 

     ArrayList<String> list = new ArrayList(); 
      Elements table = doc.select("table"); 
      Elements rows = table.select("tr"); 

      for (int i = 0; i < rows.size(); i++) { 
       org.jsoup.nodes.Element row = rows.get(i); 
       Elements cols = row.select("td"); 

       list.add(cols.get(i).text()); 


       ArrayAdapter<String> adapter = new ArrayAdapter(this, R.layout.datalayout, list); 
       ListView view = (ListView) findViewById(R.id.dataListView); 
       view.setAdapter(adapter); 
      } 

    } 
} 
+0

'doc' является' null' при вызове 'выберите()' на нем, потому что 'downloadThread' вы начали перед этим еще не завершен, и это, вероятно, где вы его инициализации. –

+0

Итак, что мне делать? @MikeM. – SimranTea

+0

О, да, вы отправили нить прямо там. Не видел. Дайте минуту, и я реорганизую ваш код. –

ответ

1

Вы начинаете отдельный поток для выполнения загрузки и инициализации doc. Этот поток выполняется асинхронно, поэтому doc по-прежнему null, когда вы вызываете select() на нем сразу после начала потока.

Переместить код синтаксического анализа, чтобы после загрузки в run() метода потока, а также использовать «runOnUiThread() метод s после синтаксического анализа, чтобы установить ListView» Activity s Adapter, так как вы не можете коснуться View s непосредственно из этой загрузки нити ,

private Document doc; 
private ArrayList<String> list = new ArrayList<>(); 

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

    Thread downloadThread = new Thread() { 
     public void run() { 
      try { 
       doc = Jsoup.connect("http://thewebsite.html").get(); 

       Elements table = doc.select("table"); 
       Elements rows = table.select("tr"); 

       for (int i = 0; i < rows.size(); i++) { 
        org.jsoup.nodes.Element row = rows.get(i); 
        Elements cols = row.select("td"); 

        list.add(cols.get(i).text()); 
       } 

       runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          setListAdapter(); 
         } 
        } 
       ); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    downloadThread.start(); 
} 

private void setListAdapter() { 
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.datalayout, list); 
    ListView view = (ListView) findViewById(R.id.dataListView); 
    view.setAdapter(adapter); 
} 
+1

Большое вам спасибо, я только что закончил то, что хотел сделать с этим классом, и все работает соответственно !! – SimranTea