Android中AsyncTask的OutOfMemory [英] OutOfMemory on AsyncTask in Android
问题描述
使用此代码时出现内存不足异常:
Im getting an OutOfMemory Exception when using this code:
class ApiTask extends AsyncTask<URI, Void, String> {
private Exception exception;
protected void onPreExecute() {
dialog = ProgressDialog.show(DownloadedActivity.this, "",
"Contacting Server...", true);
}
protected String doInBackground(URI... uri) {
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
try {
request.setURI(uri[0]);
return client.execute(request, new BasicResponseHandler());
} catch (Exception e) {
e.printStackTrace();
}
return "Error";
} catch (Exception e) {
this.exception = e;
return "Error";
}
}
@Override
protected void onPostExecute(String result) {
dialog.dismiss();
processJSON(result);
updateListView();
result = null;
System.gc();
}
}
当我在刷新方法中第二次运行此代码时发生错误,这使我怀疑是内存泄漏.响应是一个大的JSON对象.我希望找出我做错了什么,我已经尝试了一些方法,但看起来响应仍然存在.
The error happens when I run this code a second time in a refresh method, this makes me suspect a memory leak. The response is a large JSON object. I hope to find out what Im doing wrong Ive tried a few things but its looking like the response stays in memory.
这是logcat错误:
Here is the logcat error:
05-09 13:45:13.764: E/AndroidRuntime(2438): Uncaught handler: thread AsyncTask #2 exiting due to uncaught exception
05-09 13:45:13.784: E/AndroidRuntime(2438): java.lang.RuntimeException: An error occured while executing doInBackground()
05-09 13:45:13.784: E/AndroidRuntime(2438): at android.os.AsyncTask$3.done(AsyncTask.java:200)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.lang.Thread.run(Thread.java:1096)
05-09 13:45:13.784: E/AndroidRuntime(2438): Caused by: java.lang.OutOfMemoryError
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.lang.String.<init>(String.java:513)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.util.CharArrayBuffer.toString(CharArrayBuffer.java:261)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:141)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:76)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627)
05-09 13:45:13.784: E/AndroidRuntime(2438): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)
05-09 13:45:13.784: E/AndroidRuntime(2438): at com.nelissen.couchforwarder.couch.DownloadedActivity$ApiTask.doInBackground(DownloadedActivity.java:382)
05-09 13:45:13.784: E/AndroidRuntime(2438): at com.nelissen.couchforwarder.couch.DownloadedActivity$ApiTask.doInBackground(DownloadedActivity.java:1)
05-09 13:45:13.784: E/AndroidRuntime(2438): at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-09 13:45:13.784: E/AndroidRuntime(2438): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-09 13:45:13.784: E/AndroidRuntime(2438): ... 4 more
推荐答案
我发现AsyncTask和Activity有点松散地绑在一起" ..也许AsyncTask并不完全..DIE!哈哈:D
I found that AsyncTask and Activity are kind of "loosely tied" to each other.. so maybe that AsyncTask doesn't quite..DIE!! haha :D
尝试阅读此链接:用于长期运行操作的Android AsyncTask
无论如何,在我的代码onRefresh上,我都杀死了他们两个!
Anyway in my code onRefresh I killed them both!
public void onRefresh(View view){ // this is a method inside the Activity about to be killed
downloadXmlTaskObject = null; // Garbage Collectible
finish(); // Finish the Activity
Intent intent = getIntent(); // get the intent of the Activity
startActivity(intent); // and Create a new Activity
}
我不知道它是否满足您的要求.您可以仅为下载或解析等目的创建一个Activity,然后将它们全部杀死! 祝你好运! ^ _ ^
I don't know though if it will meet your requirements or not.. you can create an Activity solely for the purpose of downloading or parsing etc. Then kill them both! Good luck! ^_^
这篇关于Android中AsyncTask的OutOfMemory的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!