java.lang.outofmemoryerror即使它们没有图像

时间:2013-03-25 13:00:11

标签: android

我在谷歌广告以外的活动中没有使用任何图片。但我得到了java.lang.outofmemoryerror,app正在崩溃。

这里是logcat

03-25 18:24:22.125: E/AndroidRuntime(277): FATAL EXCEPTION: AsyncTask #2
03-25 18:24:22.125: E/AndroidRuntime(277): java.lang.RuntimeException: An error occured while executing doInBackground()
03-25 18:24:22.125: E/AndroidRuntime(277):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.lang.Thread.run(Thread.java:1096)
03-25 18:24:22.125: E/AndroidRuntime(277): Caused by: java.lang.OutOfMemoryError
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.kxml2.io.KXmlParser.push(KXmlParser.java:626)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.kxml2.io.KXmlParser.pushText(KXmlParser.java:865)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.kxml2.io.KXmlParser.nextImpl(KXmlParser.java:354)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.kxml2.io.KXmlParser.next(KXmlParser.java:1385)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:210)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:366)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:233)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:366)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:121)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:137)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.transport.Transport.parseResponse(Transport.java:63)
03-25 18:24:22.125: E/AndroidRuntime(277):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100)
03-25 18:24:22.125: E/AndroidRuntime(277):  at com.netserv.Pungry.RestaurantsList.SendRequesttoServer(RestaurantsList.java:207)
03-25 18:24:22.125: E/AndroidRuntime(277):  at com.netserv.Pungry.RestaurantsList$ListData.doInBackground(RestaurantsList.java:148)
03-25 18:24:22.125: E/AndroidRuntime(277):  at com.netserv.Pungry.RestaurantsList$ListData.doInBackground(RestaurantsList.java:1)
03-25 18:24:22.125: E/AndroidRuntime(277):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-25 18:24:22.125: E/AndroidRuntime(277):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-25 18:24:22.125: E/AndroidRuntime(277):  ... 4 more
03-25 18:24:22.485: E/WindowManager(277): Activity com.netserv.Pungry.RestaurantsList has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43f0d2e8 that was originally added here
03-25 18:24:22.485: E/WindowManager(277): android.view.WindowLeaked: Activity com.netserv.Pungry.RestaurantsList has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43f0d2e8 that was originally added here
03-25 18:24:22.485: E/WindowManager(277):   at android.view.ViewRoot.<init>(ViewRoot.java:247)
03-25 18:24:22.485: E/WindowManager(277):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
03-25 18:24:22.485: E/WindowManager(277):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
03-25 18:24:22.485: E/WindowManager(277):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
03-25 18:24:22.485: E/WindowManager(277):   at android.app.Dialog.show(Dialog.java:241)
03-25 18:24:22.485: E/WindowManager(277):   at com.netserv.Pungry.RestaurantsList$ListData.onPreExecute(RestaurantsList.java:159)
03-25 18:24:22.485: E/WindowManager(277):   at android.os.AsyncTask.execute(AsyncTask.java:391)
03-25 18:24:22.485: E/WindowManager(277):   at com.netserv.Pungry.RestaurantsList.onCreate(RestaurantsList.java:83)
03-25 18:24:22.485: E/WindowManager(277):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-25 18:24:22.485: E/WindowManager(277):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-25 18:24:22.485: E/WindowManager(277):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-25 18:24:22.485: E/WindowManager(277):   at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-25 18:24:22.485: E/WindowManager(277):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-25 18:24:22.485: E/WindowManager(277):   at android.os.Handler.dispatchMessage(Handler.java:99)
03-25 18:24:22.485: E/WindowManager(277):   at android.os.Looper.loop(Looper.java:123)
03-25 18:24:22.485: E/WindowManager(277):   at android.app.ActivityThread.main(ActivityThread.java:4627)
03-25 18:24:22.485: E/WindowManager(277):   at java.lang.reflect.Method.invokeNative(Native Method)
03-25 18:24:22.485: E/WindowManager(277):   at java.lang.reflect.Method.invoke(Method.java:521)
03-25 18:24:22.485: E/WindowManager(277):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-25 18:24:22.485: E/WindowManager(277):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-25 18:24:22.485: E/WindowManager(277):   at dalvik.system.NativeStart.main(Native Method)

这是我的AsyncTask类,我收到错误

public class ListData extends AsyncTask<String, Void, String> {

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        dialog.dismiss();
        try {
            if (!lstresponse.isEmpty()) {
                lstresult.addAll(lstresponse);
                GlobVariables.restaurant_response = lstresult;
                lst_restaurant.setAdapter(CustAdapter);
            } else
                Toast.makeText(getApplicationContext(),
                        "No result found for" + " " + check,
                        Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        SendRequesttoServer(params);
        return "1";
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        dialog = new ProgressDialog(RestaurantsList.this);
        dialog.setMessage("Please Wait...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();

    }

}

public void SendRequesttoServer(String[] params) {
    try {
        if (GlobVariables.MenuSelectd.equals("Cuisine")
                || GlobVariables.Selecteditem.equals("Cuisines")) {
            METHOD = "GetRestaurantsByCuisines";

            request = new SoapObject(NAMESPACE, METHOD);
            request.addProperty("cuisineName", params[0]);
            request.addProperty("cityName", params[1]);
        } else if (GlobVariables.MenuSelectd.equals("locations")
                || GlobVariables.Selecteditem.equals("Location")) {
            METHOD = "GetRestaurantsByLocations";
            request = new SoapObject(NAMESPACE, METHOD);
            request.addProperty("location", params[0]);
            request.addProperty("cityName", params[1]);
        } else if (GlobVariables.Selecteditem.equals("ByName")) {
            METHOD = "GetRestaurantsByName";
            request = new SoapObject(NAMESPACE, METHOD);
            request.addProperty("restaurantName", params[0]);
            request.addProperty("cityName", params[1]);

        } else {
            METHOD = "SearchRestaurant";
            request = new SoapObject(NAMESPACE, METHOD);
            request.addProperty("searchParameter", params[0]);
            request.addProperty("cityName", params[1]);
        }

        SOAP_ACTION = NAMESPACE + METHOD;

        // SoapObject request = new SoapObject(NAMESPACE, METHOD);
        // request.addProperty("location", params[0]);
        // request.addProperty("cityName", params[1]);
        check = params[0];
        SoapSerializationEnvelope res = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        res.dotNet = true;
        res.setOutputSoapObject(request);

        HttpTransportSE call = new HttpTransportSE(url);

        SoapPrimitive result;
        call.call(SOAP_ACTION, res);
        result = (SoapPrimitive) res.getResponse();
        ParseDetails Objparsecities = new ParseDetails(
                new ByteArrayInputStream(result.toString()
                        .getBytes("UTF-8")));
        lstresponse = Objparsecities.parse();
        System.out.println(lstresponse.size());

    } catch (SoapFault e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

我能知道为什么我收到java.lang.outofmemoy错误,我在做什么错误?

感谢:)

2 个答案:

答案 0 :(得分:0)

在Android中,每个应用程序都分配了 VM预算。 VM预算是任何应用程序可以使用的最大内存量。此内存限制包括所有内容,位图(即使它是在外部堆上创建的),对象等。每当应用程序超出此限制时,都会抛出OOM异常。

VM预算的值介于16MB到80MB之间。这取决于设备。

即使打印大量日志也会导致OOM问题,我已经对自己进行了测试。

同样在您的情况下,日志清楚地说明您在异步任务中的onPreExecute方法中添加的对话框正在泄漏。您是否在处理活动中的方向更改?

  
    

03-25 18:24:22.485:E / WindowManager(277):活动com.netserv.Pungry.RestaurantsList泄露了最初添加到此处的窗口com.android.internal.policy.impl.PhoneWindow$DecorView@43f0d2e8

         

03-25 18:24:22.485:E / WindowManager(277):android.view.WindowLeaked:Activity com.netserv.Pungry.RestaurantsList泄露了窗口com.android.internal.policy.impl.PhoneWindow $ DecorView @最初添加的43f0d2e8

  

如果您没有处理方向更改,那么对于每个方向更改,将再次创建活动并执行onCreate,这可能会一次又一次地触发异步任务。这也可以带来更高的内存利用率。

您的服务器响应有多大,我有过服务器响应的经验,这个响应是超过50,000个节点,从长远来看会导致问题。

您是否使用外部lib来解析XML数据?我建议编写一个简单的SAX解析器而不是它,它将减少对象创建的数量,并且控件保留在您自己的代码中

答案 1 :(得分:0)

问题很可能是您使用kso​​ap2通过SOAP请求发送/接收大量数据。只要超出内存,就会导致OutOfMemoryError。为了实现这一目标,您的应用程序中不一定必须包含图像。

之前已经报道过使用此库的问题。此线程中的解决方案可能对您有用:

Very large SOAP response - Android- out of memory error