2

ArrayAdapter を使用して Android プログラムに ListView を表示し、文字列配列からデータを取得しています。通常、InputStream からデータを取得して文字列配列を埋め、ListView が適切に表示されます。ただし、InputStream が空の場合、配列を文字列値で初期化しました。これが発生すると、arrayadapter をリストビューに適用するときに NullPointException が発生します。
文字列配列を初期化する方法は次のとおりです。

    protected String[] doInBackground(Void...parameters ) {
  .........  do something
   String[] result = new String[50];
   result[0] = "No restaurants found in this area";
      .......  get my httpconnection

これは、文字列配列にデータを入力する方法です。

  ........
  if(responseCode == HttpURLConnection.HTTP_OK) {
    InputStream in = httpConnection.getInputStream();
    BufferedReader br = new BufferedReader(
        new InputStreamReader(in));
  String line;

int x=0;
while ((line = br.readLine()) != null) {

    result[x] = line;

    x++;
} 

    return result;
   }

これは、リストビューを作成する場所です。

   protected void onPostExecute(String[] result) {

        ListView restaurant_list = (ListView) findViewById(R.id.restaurant_list);
        final ArrayAdapter<String> arrayAdpt = new ArrayAdapter<String>(getApplicationContext(), R.layout.listview, R.id.viewtext, result);
        restaurant_list.setAdapter(arrayAdpt);

    }

入力ストリームからデータを取得すると、すべてが機能します。データが取得されない場合、文字列配列には初​​期化値のみが含まれ、プログラムは list.setAdapter(arrayAdpt) 行 (最後の行) で爆発します。また、この処理は doInBackground メソッド配下の非同期タスク (AsynTask) で行われています。文字列配列内のデータのソースによって、arrayadapter の動作に違いが生じるのはなぜですか? 誰にも提案がありますか?

Ok。使用するロジックを変更しました

 List<String> result = new ArrayList<String>();
 .....
 result.add(line);
 .....
  return (String[]) result.toArray();

そして、エラーが doInBackground メソッドにあるため、戻り命令で想定する nullexception が返されます。以下は、logcat からのエラーです。

  03-09 20:03:13.755: E/AndroidRuntime(6089): FATAL EXCEPTION: AsyncTask #1
  03-09 20:03:13.755: E/AndroidRuntime(6089): java.lang.RuntimeException: An error occured while executing doInBackground()
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at android.os.AsyncTask$3.done(AsyncTask.java:299)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at java.util.concurrent.FutureTask.run(FutureTask.java:239)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.lang.Thread.run(Thread.java:856)
   03-09 20:03:13.755: E/AndroidRuntime(6089): Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at com.example.herb4.MainActivity$GetRestaurant.doInBackground(MainActivity.java:173)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at com.example.herb4.MainActivity$GetRestaurant.doInBackground(MainActivity.java:1)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
4

1 に答える 1

0

InputStreamが空の場合、配列を文字列値で初期化しました

この場合 NullPointException、の文字列配列を作成したSize 50が、に1つの項目しか追加していないため、例外が発生します0th position

静的サイズの配列の代わりにWebサービスから取得するアイテムの量がわからない場合は、配列の代わりにNullPointException例外を使用しないようにします。ArrayList

例 :-

ArrayList<String> result=new ArrayList<String>();

if(<Stream not empty>){

  //Add all elemnts to ArrayList
  result.add(line);
}
else{

   result.add("No restaurants found in this area");

 }
于 2013-03-09T19:48:16.680 に答える