我正在使用ArrayAdapter在我的Android程序中显示一个ListView,以从字符串数组中获取数据。通常,我从InputStream获取数据以填充字符串数组并正确显示ListView。但是,如果我的InputStream为空,我使用字符串值初始化我的数组。发生这种情况时,我将arrayadapter应用到listview时会出现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;
}
这是我创建Listview的地方:
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的工作方式产生影响?有人有建议吗?
确定。我改变了逻辑以使用
List<String> result = new ArrayList<String>();
.....
result.add(line);
.....
return (String[]) result.toArray();
它给了我一个nullexception,我会在返回指令中假设,因为错误在doInBackground方法中。以下是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)
答案 0 :(得分:0)
如果我的InputStream为空,我使用字符串值
初始化我的数组
在这种情况下,您将获得NullPointException
异常,因为您创建了Size 50
的字符串数组,但只在0th position
添加了一个项目。
如果您不知道从webservice而不是静态大小数组中获取了多少项,请避免NullPointException
异常使用ArrayList
而不是Array。
示例: -
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");
}