Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在AsyncTask中捕获内存不足异常_Java_Android_Http - Fatal编程技术网

Java 如何在AsyncTask中捕获内存不足异常

Java 如何在AsyncTask中捕获内存不足异常,java,android,http,Java,Android,Http,我的android应用程序使用Web服务连接外部数据库。在一个例子中,我有大量的数据,我得到了内存不足异常: 09-09 20:05:59.441: ERROR/dalvikvm(4688): Out of memory: Heap Size=15751KB, Allocated=14962KB, Bitmap Size=687KB 09-09 20:05:59.451: WARN/dalvikvm(4688): threadid=23: thread exiting with uncaught

我的android应用程序使用Web服务连接外部数据库。在一个例子中,我有大量的数据,我得到了内存不足异常:

09-09 20:05:59.441: ERROR/dalvikvm(4688): Out of memory: Heap Size=15751KB, Allocated=14962KB, Bitmap Size=687KB
09-09 20:05:59.451: WARN/dalvikvm(4688): threadid=23: thread exiting with uncaught exception (group=0x4001e390)
09-09 20:05:59.462: ERROR/AndroidRuntime(4688): Uncaught handler: thread AsyncTask #5 exiting due to uncaught exception
09-09 20:05:59.731: ERROR/AndroidRuntime(4688): java.lang.RuntimeException: An error occured while executing doInBackground()
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.Thread.run(Thread.java:1102)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688): Caused by: java.lang.OutOfMemoryError
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:142)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.StringBuilder.append(StringBuilder.java:124)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextString(JSONTokener.java:252)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextValue(JSONTokener.java:316)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONObject.<init>(JSONObject.java:204)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextValue(JSONTokener.java:319)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONObject.<init>(JSONObject.java:204)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextValue(JSONTokener.java:319)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONArray.<init>(JSONArray.java:116)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONArray.<init>(JSONArray.java:150)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity.setTasks(ViewActivity.java:219)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity.fetchTasks(ViewActivity.java:133)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity.access$9(ViewActivity.java:110)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity$LoadingDataFromServer.doInBackground(ViewActivity.java:420)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity$LoadingDataFromServer.doInBackground(ViewActivity.java:1)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     ... 4 more
09-09 20:05:59.441:错误/dalvikvm(4688):内存不足:堆大小=15751KB,分配=14962KB,位图大小=687KB
09-09 20:05:59.451:WARN/dalvikvm(4688):threadid=23:线程以未捕获异常退出(组=0x4001e390)
09-09 20:05:59.462:错误/AndroidRuntime(4688):未捕获处理程序:线程异步任务#5由于未捕获异常而退出
09-09 20:05:59.731:错误/AndroidRuntime(4688):java.lang.RuntimeException:执行doInBackground()时出错
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):在android.os.AsyncTask$3.done(AsyncTask.java:200)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):在java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):在java.lang.Thread.run(Thread.java:1102)处
09-09 20:05:59.731:错误/AndroidRuntime(4688):由以下原因引起:java.lang.OutOfMemoryError
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:142)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.lang.StringBuilder.append(StringBuilder.java:124)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONTokener.nextString(JSONTokener.java:252)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONTokener.nextValue(JSONTokener.java:316)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONObject.(JSONObject.java:204)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONTokener.nextValue(JSONTokener.java:319)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONObject.(JSONObject.java:204)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONTokener.nextValue(JSONTokener.java:319)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONArray(JSONArray.java:116)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于org.json.JSONArray(JSONArray.java:150)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于se.softwerk.timelog.activity.ViewActivity.setTasks(ViewActivity.java:219)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于se.softwerk.timelog.activity.ViewActivity.fetchTasks(ViewActivity.java:133)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于se.softwerk.timelog.activity.ViewActivity.access$9(ViewActivity.java:110)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):在se.softwerk.timelog.activity.ViewActivity$LoadingDataFromServer.doInBackground(ViewActivity.java:420)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):在se.softwerk.timelog.activity.ViewActivity$LoadingDataFromServer.doInBackground(ViewActivity.java:1)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于android.os.AsyncTask$2.call(AsyncTask.java:185)
09-09 20:05:59.731:ERROR/AndroidRuntime(4688):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-09 20:05:59.731:错误/AndroidRuntime(4688):。。。4更多
这是我的班级:

private class LoadingDataFromServer extends AsyncTask<Void, Void, Void> {

        @Override
        public void onPreExecute() {
            progress = ProgressDialog.show(ViewActivity.this, null,"Loading ...", true);
        }

        @Override
        protected void onPostExecute(Void result) {
            try {
                ListView lv = (ListView) main_activity.findViewById(R.id.listTask);
                lv.setAdapter(new TaskAdapter(main_activity));
                progress.dismiss();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                fetchTasks();
            } catch (Exception e) {      //DOES NOT WORK
                progress.dismiss();
                Toast.makeText(ViewActivity.this, "Enormous number of data, select smaller criteria", Toast.LENGTH_SHORT).show();
                finish();
            }
            return null;
        }
    }
private类从服务器加载数据扩展异步任务{
@凌驾
公共无效onPreExecute(){
progress=ProgressDialog.show(ViewActivity.this,null,“加载…”,true);
}
@凌驾
受保护的void onPostExecute(void结果){
试一试{
ListView lv=(ListView)main_activity.findViewById(R.id.listTask);
lv.setAdapter(新任务适配器(主活动));
进步。解散();
}捕获(例外e){
System.out.println(e.getMessage());
}
}
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
fetchTasks();
}catch(异常e){//不起作用
进步。解散();
Toast.makeText(ViewActivity.this,“大量数据,选择较小的标准”,Toast.LENGTH_SHORT.show();
完成();
}
返回null;
}
}
如何在
doInBackground
中捕获此异常? 我当前的尝试不起作用。

不会扩展异常,这就是您无法捕获它的原因

这个代码应该可以工作

try
{
    fetchTasks();       
}
catch(OutOfMemoryError e)
{
    // do something     
}
但是,
OutOfMemoryError
继承自
java.lang.Error
而非
java.lang.Exception
,它们都继承自
java.lang.Throwable
。您只能在java中抛出
java.lang.Throwable
子类的
实例,以便捕获任何错误或异常:

try {
    ...
} catch (Throwable t) {  // "catch all subclasses of java.lang.Throwable"
    ...
}

或者,您也可以捕获可丢弃的
。但是我想知道这是否是处理这种错误情况的正确方法。捕获trowable是一回事,但是您可以使用pull解析器fx jacksonSee避免此错误。很高兴知道,但这不是我的错误。请检查我的答案,如果你有任何想法,我很高兴能听到。
try {
    ...
} catch (Throwable t) {  // "catch all subclasses of java.lang.Throwable"
    ...
}