2011-10-24 20 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) 

問題の場所はわかりません。

感謝:)

+0

今、別の問題があります。 doInBackgroundで私はXMLデータを取得しています。 このデータをビューに送信する必要があります。 'String []型=新しいString [] { "A":' そしてMyArrayOfCitationsはそのような何かだった。初め 私は 'setListAdapter(新しいArrayAdapter (これ、R.layout.list_item、MyArrayOfCitations))を持っています、 "B"}; ' そして、MyArrayOfCitationsをリストに置き換える必要があります UIを表示した後にデータ検索XMLが開始されたらどうしますか? – guillaume

答えて

5

あなたはcitationsフィールドを初期化しませんでした。このようなあなたの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点については、私は自分のコードの読みやすさに注意します。 – guillaume

関連する問題