Java 如果要编写文件,AsyncTask是如何工作的?

Java 如果要编写文件,AsyncTask是如何工作的?,java,android,android-asynctask,Java,Android,Android Asynctask,首先为我的英语感到抱歉,其次我是Android和Java新手,所以不要评判我 我可以从正在执行的Get请求中读取JSON文件,但是 我想把得到的响应写在内存设备的某个文件中。我不知道如何处理异步任务,因为我的错误已经显示出来了。有人能告诉我我做错了什么吗 08-05 15:06:14.305 3302-3317/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 Process: shapp.odk.org.shapp, PID: 3302

首先为我的英语感到抱歉,其次我是Android和Java新手,所以不要评判我

我可以从正在执行的Get请求中读取JSON文件,但是 我想把得到的响应写在内存设备的某个文件中。我不知道如何处理异步任务,因为我的错误已经显示出来了。有人能告诉我我做错了什么吗

08-05 15:06:14.305    3302-3317/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: shapp.odk.org.shapp, PID: 3302
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference
        at shapp.odk.org.shapp.RequestHandlerApi.doInBackground(RequestHandlerApi.java:58)
        at shapp.odk.org.shapp.RequestHandlerApi.doInBackground(RequestHandlerApi.java:18)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
        at java.lang.Thread.run(Thread.java:818)
提前感谢:)

class RequestHandlerApi扩展了异步任务{
私密语境;
@凌驾
受保护的字符串doInBackground(字符串…url){
试一试{
URL urlHarassmentApi=新URL(“http://10.0.2.2:5000/geo-空气污染指数);
HttpURLConnection connMain=(HttpURLConnection)urlHarassmentApi.openConnection();
setRequestProperty(“接受”、“应用程序/json”);
setRequestMethod(“GET”);
Log.d(“Hello”和“+connMain”);
/*
如果(connMain.getResponseCode()!=200){
抛出新的RuntimeException(“失败:HTTP错误代码:”
+getResponseCode());
}*/
BufferedReader reader=新的BufferedReader(
新的InputStreamReader(connMain.getInputStream());
StringBuilder响应=新建StringBuilder();
字符串输入线;
而((inputLine=reader.readLine())!=null){
追加(inputLine);
}
reader.close();
试一试{
OutputStreamWriter OutputStreamWriter=新的OutputStreamWriter(contextMain.openFileOutput(“config.json”,Context.MODE_PRIVATE));
outputStreamWriter.write(response.toString());
outputStreamWriter.close();
}
捕获(IOE异常){
Log.e(“异常”,“文件写入失败:”+e.toString());
}
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
}

您的contextMain为null您可以创建一个构造函数,将活动上下文传递给它,然后使用它

把你的电话改成

 new RequestHandlerApi(Your_Activty_Name.this).execute("your url here");
然后在RequestHandlerApi类中创建一个构造函数

然后创建一个构造函数并创建一个变量上下文

 public RequestHandlerApi(Context context){
   this.contextMain =context;
} 

现在您的contextMain不是空的。

@nhaarman感谢您编辑了我的帖子(y)!将活动上下文传递给后台线程是获得内存泄漏的可靠方法。@Budius以及如何避免内存泄漏?首先,您没有真正的理由使用AsyncTask。您可以使用
IntentService
,因为AsyncTask是用来向UI提供反馈的,而您没有这样做。然后您就可以毫无问题地使用服务上下文。但要简单地“修复”当前代码,最好是获取应用程序上下文,而不是
this.contextMain=context.getApplicationContext()
@Budius-aha,好的,我明白了。谢谢你的建议!
 public RequestHandlerApi(Context context){
   this.contextMain =context;
}