2011-10-24 6 views
2

AsynTask를 사용하여 XML 데이터를 구문 분석하려고합니다.치명적인 예외 : AsyncTask # 1

static List<String> citations = null; 

    static void setCitations(List<String> data) { 
     citations = data; 
    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 

     new data().execute(); 

을 그리고 데이터 클래스에 난했습니다 : 그래서 활동에 난했습니다

대신 난 내 XML 파서를했습니다 citations.add의
class data extends AsyncTask<Void, Void, List<String>> { 

    private XMLReader saxReader; 
    private SimpleContentHandler simpleContentHandler; 

    private List<String> citations; 

    @Override 
    protected void onPreExecute() { 
     Log.i("AsyncTask", "onPreExecute"); 
    } 

    @Override 
    public void onPostExecute(List<String> citations) { 
     GuiguiActivity.setCitations(citations); 
    } 


    @Override 
    protected List<String> doInBackground(Void... params) { 
       citations.add("TEST 1");citations.add("TEST 2"); 
       return citations; 
     } 
} 

하지만,이 경우에도에 citations.add 오류가 발생합니다.

10-24 15:28:46.647: E/AndroidRuntime(1160): FATAL EXCEPTION: AsyncTask #1 
10-24 15:28:46.647: E/AndroidRuntime(1160): java.lang.RuntimeException: An error occured while executing doInBackground() 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.lang.Thread.run(Thread.java:856) 
10-24 15:28:46.647: E/AndroidRuntime(1160): Caused by: java.lang.NullPointerException 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at guigui.first.project.data.doInBackground(data.java:82) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at guigui.first.project.data.doInBackground(data.java:1) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
10-24 15:28:46.647: E/AndroidRuntime(1160):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

어디에 문제가 있는지 알 수 없습니다.

감사합니다 :) 당신은 citations 필드를 초기화하지 않은

+0

또 다른 문제가 있습니다. doInBackground에서 XML 데이터가 나타납니다. 그래서이 데이터를보기로 보내야합니다. '문자열 [] = 새로운 String [] { "A":' 그리고 MyArrayOfCitations는 그런 일이었다 시작되는 시점에 나는 'setListAdapter (새 ArrayAdapter와 (이, R.layout.list_item, MyArrayOfCitations))를 가지고 , "B"}; ' 이제 MyArrayOfCitations가 목록으로 바뀌어야합니다. UI를 표시 한 후에 데이터 검색 XML이 시작되면 어떻게해야합니까? – guillaume

답변

5

. 이처럼 data 클래스에 생성자를 추가

public data(){ 
    citations = new ArrayList<String>(); 
} 
+0

고마워, 지금은 작동 중 – guillaume

1

당신이이처럼 인용 필드를 초기화해야 AsyncTask를에서 :

class data extends AsyncTask<Void, Void, List<String>> { 

private XMLReader saxReader; 
private SimpleContentHandler simpleContentHandler; 

//I chose and array list here as a concrete implmentation. But you could use any other 
//class that also implements the List interface if you want to. 
private List<String> citations = new ArrayList<String>(); 



@Override 
protected void onPreExecute() { 
    Log.i("AsyncTask", "onPreExecute"); 
} 

@Override 
public void onPostExecute(List<String> citations) { 
    GuiguiActivity.setCitations(citations); 
} 


@Override 
protected List<String> doInBackground(Void... params) { 
      citations.add("TEST 1");citations.add("TEST 2"); 
      return citations; 
    } 
} 

다른 두 가지 :

  1. 표준 규칙에 java에서는 클래스 이름이 항상 대문자로 시작해야한다고 말합니다. AsyncTask 클래스 이름을 DataTask와 같은 것으로 변경하는 것이 좋습니다.이 규칙은 규약을 준수하고 클래스의 기능에 대해보다 구체적입니다.
  2. 비슷한 이름을 가진 많은 변수가 있습니다. 각각의 의미가 실제로 무엇을 의미 하는지를 시험하고 플러시해야하며 모든 변수에 더 많은 의미있는 이름을 부여해야합니다. 이렇게하면 혼란을 막을 수 있습니다.
+0

고마워, 내 코드가 정말로 분명하지 않다는 것을 알고있다. 지금은 안드로이드 개발을 배우므로 첫 번째 목표를 달성 할 때 다른 코드 작성자를 쓸 것입니다 하지만 2 점은 thx로, 코드 작성이 쉽습니다. – guillaume