Android 空指针异步任务返回
我正在尝试使用Android 空指针异步任务返回,android,csv,android-asynctask,Android,Csv,Android Asynctask,我正在尝试使用asynctask访问服务器上的文件,这是我的代码: new PostTask().execute("http://antoniofalcone.it/fantavoti/gazz.csv"); @Override protected String doInBackground(String... params) { String url=params[0]; HttpGet httpGet = new HttpGet(url); HttpResponse
asynctask
访问服务器上的文件,这是我的代码:
new PostTask().execute("http://antoniofalcone.it/fantavoti/gazz.csv");
@Override
protected String doInBackground(String... params) {
String url=params[0];
HttpGet httpGet = new HttpGet(url);
HttpResponse response = null;
try {
response = httpClient.execute(httpGet, localContext);
} catch (ClientProtocolException e) {
Log.d("clientprotocol", log2);
e.printStackTrace();
} catch (IOException e) {
Log.d("IOexception: ", log2);
e.printStackTrace();
}
try {
reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent()
)
);
} catch (IllegalStateException e) {
Log.d("Illegalstate: ", log2);
e.printStackTrace();
} catch (IOException e) {
Log.d("IOException2 ", log2);
e.printStackTrace();
}
return "All Done!";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
我必须读取该csv文件,但我在BufferedReader(“读取器”)
上得到一个Nullpointerexception
。处理资产目录中的本地文件没问题。
有人能帮我吗
以下是完整的日志:
08-31 18:16:54.930: W/dalvikvm(2218): threadid=1: thread exiting with uncaught exception (group=0xa4ceeb20)
08-31 18:16:54.930: E/AndroidRuntime(2218): FATAL EXCEPTION: main
08-31 18:16:54.930: E/AndroidRuntime(2218): Process: com.falc1.fantacalcio2, PID: 2218
08-31 18:16:54.930: E/AndroidRuntime(2218): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.falc1.fantacalcio2/com.falc1.fantacalcio2.MainActivity}: java.lang.NullPointerException
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.ActivityThread.access$800(ActivityThread.java:135)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.os.Handler.dispatchMessage(Handler.java:102)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.os.Looper.loop(Looper.java:136)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.ActivityThread.main(ActivityThread.java:5017)
08-31 18:16:54.930: E/AndroidRuntime(2218): at java.lang.reflect.Method.invokeNative(Native Method)
08-31 18:16:54.930: E/AndroidRuntime(2218): at java.lang.reflect.Method.invoke(Method.java:515)
08-31 18:16:54.930: E/AndroidRuntime(2218): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-31 18:16:54.930: E/AndroidRuntime(2218): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-31 18:16:54.930: E/AndroidRuntime(2218): at dalvik.system.NativeStart.main(Native Method)
08-31 18:16:54.930: E/AndroidRuntime(2218): Caused by: java.lang.NullPointerException
08-31 18:16:54.930: E/AndroidRuntime(2218): at fragments.VotiFragment.readCsv(VotiFragment.java:178)
08-31 18:16:54.930: E/AndroidRuntime(2218): at fragments.VotiFragment.onCreateView(VotiFragment.java:75)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.Fragment.performCreateView(Fragment.java:1700)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.BackStackRecord.run(BackStackRecord.java:684)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.Activity.performStart(Activity.java:5240)
08-31 18:16:54.930: E/AndroidRuntime(2218): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)
08-31 18:16:54.930: E/AndroidRuntime(2218): ... 11 more
语句,
response=httpClient.execute(httpGet,localContext)代码>由try/catch块正确包装,但如果引发异常(例如服务器无法访问、URL不正确或网络关闭),则catch块只打印异常并继续执行。这意味着随后的声明:
reader=newbufferedreader(
新的InputStreamReader(
response.getEntity().getContent()
)
由于响应
为空,将遇到空指针异常。httpClient.execute语句的catch块在打印出错误异常后应仅返回
。更好的方法是仅使用一组try-catch块进行请求和响应解析。类似于以下内容:
HttpResponse response = null;
try {
HttpGet httpGet = new HttpGet(url);
response = httpClient.execute(httpGet, localContext);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
} catch (IOException ioex) {
Log.d(TAG, "IOException", ioex);
} catch (IllegalStateException ise) {
Log.d(TAG, "IllegalStateException", ise);
}
由于log语句可以打印带有消息的异常,我刚刚为您组合了它。您不需要reduntant printStateTrace语句。因为ClientProtocolException继承自IOException,所以您只需要捕获基类
另外,通过在类中声明一个“TAG”变量,您可以使日志语句更易于过滤,如下所示:
public static final String TAG = VotiFragment.class.getSimpleName();
现在,我已经清理完您的代码,我刚刚意识到您的另一个问题。您的asynctask的全部目的是避免在主线程上执行网络I/O。但是您的asynctask所做的只是启动HTTP请求,而不是实际解析响应。它只是创建了读卡器对象,我认为您实际上是从该对象开始流式处理的您的UI线程。这意味着主线程上剩余的网络i/o,除非响应已完全缓冲。我建议您在后台任务中执行所有解析。这是readCsv
代码:
public void readCsv()引发IOException{
String line = "";
db.beginTransaction();
try {
while ((line = reader.readLine()) != null) {
String[] colums = line.split(",");
if (colums.length > 23) {
Log.d("CSVParser", "Skipping Bad CSV Row");
continue;
}
Player play1 = new Player(colums[1].trim(), colums[2].trim(), Integer.parseInt(colums[3]),
Integer.parseInt(colums[4]), Integer.parseInt(colums[5]),
Double.parseDouble(colums[6]), Double.parseDouble(colums[7]), Integer.parseInt(colums[8]),
Double.parseDouble(colums[9]), Integer.parseInt(colums[10]),
Integer.parseInt(colums[11]), Integer.parseInt(colums[12]));
db.addPlayer(play1);
}
} catch (IOException e) {
e.printStackTrace();
}
db.setTransactionSuccessful();
db.beginTransaction();
}
catch语句中的stacktrace是否正在执行?现在发布完整的log@AntonioFalcone:postreadCsv
方法code@AntonioFalcone-最有可能是因为真正的崩溃发生在VotiFragment.java的第178行。位于fragments.VotiFragment.readCsv(VotiFragment.java:178)
您的readCsv中的reader
变量可能为空。您做了哪些调试工作?