Android中的内存不足问题

Android中的内存不足问题,android,memory-leaks,Android,Memory Leaks,嗯,我几乎要放弃做程序员而成为设计师了。开玩笑!所以,我正在开发一个应用程序,它将在野外使用,而不需要互联网。为了让用户能够访问信息,首先他必须在进入字段之前导入所有信息。用户可以访问多个城市,他必须导入每个城市的数据。其中一些城市登记了4000多名农民。我搜索试图了解更多关于内存泄漏的信息。在我不需要使用它之后,我几乎将每个对象都设置为null,但这并没有解决我的问题。为了导入数据,我在PHP和Android之间使用带JSON的webservice。当我尝试逐个城市导入时,在导入一些之后,我会

嗯,我几乎要放弃做程序员而成为设计师了。开玩笑!所以,我正在开发一个应用程序,它将在野外使用,而不需要互联网。为了让用户能够访问信息,首先他必须在进入字段之前导入所有信息。用户可以访问多个城市,他必须导入每个城市的数据。其中一些城市登记了4000多名农民。我搜索试图了解更多关于内存泄漏的信息。在我不需要使用它之后,我几乎将每个对象都设置为null,但这并没有解决我的问题。为了导入数据,我在PHP和Android之间使用带JSON的webservice。当我尝试逐个城市导入时,在导入一些之后,我会遇到一个OutOfMemoryError。以下是日志:

07-18 10:54:12.875: E/dalvikvm-heap(8420): Out of memory on a 16777232-byte allocation.
07-18 10:54:12.880: I/dalvikvm(8420): "AsyncTask #4" prio=5 tid=15 RUNNABLE
07-18 10:54:12.880: I/dalvikvm(8420):   | group="main" sCount=0 dsCount=0 obj=0x42ad9168 self=0x597454d0
07-18 10:54:12.880: I/dalvikvm(8420):   | sysTid=8516 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1500748904
07-18 10:54:12.880: I/dalvikvm(8420):   | state=R schedstat=( 79546994965 27092848787 165998 ) utm=6340 stm=1614 core=3
07-18 10:54:12.890: I/dalvikvm(8420):   at org.apache.http.util.CharArrayBuffer.expand(CharArrayBuffer.java:~59)
07-18 10:54:12.890: I/dalvikvm(8420):   at org.apache.http.util.CharArrayBuffer.append(CharArrayBuffer.java:77)
07-18 10:54:12.895: I/dalvikvm(8420):   at org.apache.http.util.EntityUtils.toString(EntityUtils.java:136)
07-18 10:54:12.895: I/dalvikvm(8420):   at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
07-18 10:54:12.900: I/dalvikvm(8420):   at emater.gin.webservice.ServiceHandler.makeServiceCall(ServiceHandler.java:108)
07-18 10:54:12.905: I/dalvikvm(8420):   at emater.gin.activities.ModulosActivity$DadosMunicipioWebservice.doInBackground(ModulosActivity.java:2499)
07-18 10:54:12.905: I/dalvikvm(8420):   at emater.gin.activities.ModulosActivity$DadosMunicipioWebservice.doInBackground(ModulosActivity.java:1)
07-18 10:54:12.905: I/dalvikvm(8420):   at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-18 10:54:12.910: I/dalvikvm(8420):   at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-18 10:54:12.910: I/dalvikvm(8420):   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-18 10:54:12.910: I/dalvikvm(8420):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-18 10:54:12.910: I/dalvikvm(8420):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-18 10:54:12.910: I/dalvikvm(8420):   at java.lang.Thread.run(Thread.java:841)
07-18 10:54:13.120: W/dalvikvm(8420): threadid=15: thread exiting with uncaught exception (group=0x41e08700)
07-18 10:54:13.125: E/AndroidRuntime(8420): FATAL EXCEPTION: AsyncTask #4
07-18 10:54:13.125: E/AndroidRuntime(8420): java.lang.RuntimeException: An error occured while executing doInBackground()
07-18 10:54:13.125: E/AndroidRuntime(8420):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at java.lang.Thread.run(Thread.java:841)
07-18 10:54:13.125: E/AndroidRuntime(8420): Caused by: java.lang.OutOfMemoryError
07-18 10:54:13.125: E/AndroidRuntime(8420):     at org.apache.http.util.CharArrayBuffer.expand(CharArrayBuffer.java:59)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at org.apache.http.util.CharArrayBuffer.append(CharArrayBuffer.java:77)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:136)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at emater.gin.webservice.ServiceHandler.makeServiceCall(ServiceHandler.java:108)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at emater.gin.activities.ModulosActivity$DadosMunicipioWebservice.doInBackground(ModulosActivity.java:2499)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at emater.gin.activities.ModulosActivity$DadosMunicipioWebservice.doInBackground(ModulosActivity.java:1)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-18 10:54:13.125: E/AndroidRuntime(8420):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-18 10:54:13.125: E/AndroidRuntime(8420):     ... 4 more
07-18 10:54:22.915: E/WindowManager(8420): Activity emater.gin.activities.ModulosActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{451a8a50 V.E..... R....... 0,0-684,290} that was originally added here
07-18 10:54:22.915: E/WindowManager(8420): android.view.WindowLeaked: Activity emater.gin.activities.ModulosActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{451a8a50 V.E..... R....... 0,0-684,290} that was originally added here
07-18 10:54:22.915: E/WindowManager(8420):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:452)
07-18 10:54:22.915: E/WindowManager(8420):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:258)
07-18 10:54:22.915: E/WindowManager(8420):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:73)
07-18 10:54:22.915: E/WindowManager(8420):  at android.app.Dialog.show(Dialog.java:287)
07-18 10:54:22.915: E/WindowManager(8420):  at emater.gin.activities.ModulosActivity$DadosMunicipioWebservice.onPreExecute(ModulosActivity.java:2456)
07-18 10:54:22.915: E/WindowManager(8420):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
07-18 10:54:22.915: E/WindowManager(8420):  at android.os.AsyncTask.execute(AsyncTask.java:534)
07-18 10:54:22.915: E/WindowManager(8420):  at emater.gin.activities.ModulosActivity$5.onClick(ModulosActivity.java:328)
07-18 10:54:22.915: E/WindowManager(8420):  at android.view.View.performClick(View.java:4475)
07-18 10:54:22.915: E/WindowManager(8420):  at android.view.View$PerformClick.run(View.java:18786)
07-18 10:54:22.915: E/WindowManager(8420):  at android.os.Handler.handleCallback(Handler.java:730)
07-18 10:54:22.915: E/WindowManager(8420):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-18 10:54:22.915: E/WindowManager(8420):  at android.os.Looper.loop(Looper.java:176)
07-18 10:54:22.915: E/WindowManager(8420):  at android.app.ActivityThread.main(ActivityThread.java:5419)
07-18 10:54:22.915: E/WindowManager(8420):  at java.lang.reflect.Method.invokeNative(Native Method)
07-18 10:54:22.915: E/WindowManager(8420):  at java.lang.reflect.Method.invoke(Method.java:525)
07-18 10:54:22.915: E/WindowManager(8420):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
07-18 10:54:22.915: E/WindowManager(8420):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
07-18 10:54:22.915: E/WindowManager(8420):  at dalvik.system.NativeStart.main(Native Method)
07-18 10:54:29.695: I/Process(8420): Sending signal. PID: 8420 SIG: 9
我试图改进我的代码,使其不占用太多内存,这就是发生错误的代码

这是我的处理程序类,用于调用Web服务:

PS:忘了评论吧,是葡萄牙语,我来自巴西

package emater.gin.webservice;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

/*
 * Classe: ServiceHandler
 * Usada para leitura e envio de JSON.
 */
public class ServiceHandler 
{

    //Resposta
    static String response = null;

    //Recebe do servidor.
    public final static int GET = 1;

    //Envia para o servidor.
    public final static int POST = 2;

    //Construtor vazio.
    public ServiceHandler() {}

    //Faz a chamada para o servidor.
    public String makeServiceCall( String url, int method )
    {

        return this.makeServiceCall( url, method, null );

    }

    //Faz a chamada para o servidor.
    public String makeServiceCall( String url, int method, List<NameValuePair> params )
    {

        try
        {

            //HTTP Client.
            DefaultHttpClient httpClient = new DefaultHttpClient();

            //Entidade que pode ser enviada ou recebida.
            HttpEntity httpEntity = null;

            //Resposta HTTP.
            HttpResponse httpResponse = null;

            //Checa o tipo de request que vai ser feito.
            if( method == POST )
            {

                //Cria o HttpPost para enviar uma entidade.
                HttpPost httpPost = new HttpPost( url );

                //Adicona os parametros ao post.
                if( params != null )
                {

                    //Seta a entidade de respostas no httppost com os parametros passados.
                    httpPost.setEntity( new UrlEncodedFormEntity( params ) );

                }

                //Pega a resposta do servidor a partida da enviada.
                httpResponse = httpClient.execute( httpPost );

            }else if( method == GET )
            {

                //Adiciona os parametros e gera a URL.
                if( params != null )
                {

                    String paramString = URLEncodedUtils.format( params, "utf-8" );

                    url += "?" + paramString;

                }

                HttpGet httpGet = new HttpGet( url );

                //Envia a URL e pega a resposta.
                httpResponse = httpClient.execute( httpGet );

            }

            //Liberar memoria.
            httpClient = null;

            //Pega a resposta e bota em uma nova entidade para ser usada.
            httpEntity = httpResponse.getEntity();

            //Liberar memoria.
            httpResponse = null;

            response = EntityUtils.toString( httpEntity );

        }catch( UnsupportedEncodingException e ) 
        {

            e.printStackTrace();

        }catch( ClientProtocolException e ) 
        {

            e.printStackTrace();

        }catch( IOException e )
        {

            e.printStackTrace();

        }

        return response;

    }

}
包emater.gin.webservice;
导入java.io.IOException;
导入java.io.UnsupportedEncodingException;
导入java.util.List;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.ClientProtocolException;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpGet;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.client.utils.URLEncodedUtils;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.util.EntityUtils;
/*
*类别:ServiceHandler
*Usada para leitura e envio de JSON。
*/
公共类ServiceHandler
{
//Resposta
静态字符串响应=null;
//塞维多酒店。
公共最终静态int GET=1;
//Envia para o servidor。
公共最终静态int POST=2;
//承包商瓦齐奥。
公共ServiceHandler(){}
//这是我的服务。
公共字符串makeServiceCall(字符串url,int方法)
{
返回此.makeServiceCall(url,方法,null);
}
//这是我的服务。
公共字符串makeServiceCall(字符串url、int方法、列表参数)
{
尝试
{
//HTTP客户端。
DefaultHttpClient httpClient=新的DefaultHttpClient();
//所有的环境都是如此。
HttpEntity HttpEntity=null;
//Resposta HTTP。
HttpResponse HttpResponse=null;
//请把你的名字写下来。
if(方法==POST)
{
//Cria o HttpPost第二阶段环境评估。
HttpPost HttpPost=新的HttpPost(url);
//Adicona os parametros ao post。
如果(参数!=null)
{
//Seta a entidade de respostas no httppost com os Parameteros passados。
setEntity(新的UrlEncodedFormEntity(参数));
}
//我是环境党的代表。
httpResponse=httpClient.execute(httpPost);
}else if(方法==GET)
{
//Adiciona os parametros e gera是一个URL。
如果(参数!=null)
{
String paramString=URLEncodedUtils.format(params,“utf-8”);
url+=“?”+参数字符串;
}
HttpGet HttpGet=新的HttpGet(url);
//Envia a URL e pega a resposta。
httpResponse=httpClient.execute(httpGet);
}
//自由回忆。
httpClient=null;
//这是我们新的生活方式。
httpEntity=httpResponse.getEntity();
//自由回忆。
httpResponse=null;
response=EntityUtils.toString(httpEntity);
}捕获(不支持的编码异常e)
{
e、 printStackTrace();
}捕获(客户端协议例外e)
{
e、 printStackTrace();
}捕获(IOE异常)
{
e、 printStackTrace();
}
返回响应;
}
}
下面是我如何调用服务器的方法:

// Instancia para adicionar os parâmetros.
List<NameValuePair> params = new ArrayList<NameValuePair>();

// Mostra o progesso aos poucos.
publishProgress(1);

// Adiciona os parametros a serem passados para o webservice.
params.add(new BasicNameValuePair(
            MunicipioUsuarioController.COLUMN_MUNICIPIO_ID, municipioId));

params.add(new BasicNameValuePair("numeroserie", Secure.getString(
            getApplicationContext().getContentResolver(),
            Secure.ANDROID_ID)));

// Instancia quem vai lidar com o webservice.
ServiceHandler serviceHandler = new ServiceHandler();

// Faz um request a URL e pega a resposta.
String JSONString = serviceHandler.makeServiceCall(
HTTP_URL_DADOS_MUNICIPIO, ServiceHandler.POST, params);
<代码> //Suthanga。 List params=new ArrayList(); //Mostra o progesso aos poucos。 出版进度(1); //Adiciona os Parameteros a serem passados para o webservice。 参数添加(新的BasicNameValuePair( 市政管理员。列(市政ID,市政ID)); 添加(新的BasicNameValuePair(“numeroserie”,Secure.getString( getApplicationContext().getContentResolver(), 安卓(ID);; //Instancia quem vai激光雷达网络服务公司。 ServiceHandler ServiceHandler=新ServiceHandler(); //Faz um请求一个URL e pega a resposta。 字符串JSONString=serviceHandler.makeServiceCall( HTTP_URL_DADOS_市政,ServiceHandler.POST,params); 当我从Web服务获得响应时,就会发生错误。但我不认为这是因为绳子太大了。
我真的需要在这个问题上的帮助,如果你能告诉我一些关于内存泄漏的提示,那就太好了。帮助一位来自巴西的穷学员,让他自己开发一个应用程序。

导致内存不足异常的文件有多大?我不知道它有多大,但它只是文本信息。结果:我尝试导入一个拥有4700名农民的城市,一切正常,我导入了一个拥有2000名农民的感觉更好的城市,然后当我尝试导入其他拥有4500名农民的城市时,出现了错误。您可以向我们展示
异步任务
线程
或任何用于下载数据的工具吗?这可能是最有可能发生内存泄漏的原因。我使用了AsyncTask,但这里显示的任务太大了。我的doInBackground方法开始调用se
// Instancia para adicionar os parâmetros.
List<NameValuePair> params = new ArrayList<NameValuePair>();

// Mostra o progesso aos poucos.
publishProgress(1);

// Adiciona os parametros a serem passados para o webservice.
params.add(new BasicNameValuePair(
            MunicipioUsuarioController.COLUMN_MUNICIPIO_ID, municipioId));

params.add(new BasicNameValuePair("numeroserie", Secure.getString(
            getApplicationContext().getContentResolver(),
            Secure.ANDROID_ID)));

// Instancia quem vai lidar com o webservice.
ServiceHandler serviceHandler = new ServiceHandler();

// Faz um request a URL e pega a resposta.
String JSONString = serviceHandler.makeServiceCall(
HTTP_URL_DADOS_MUNICIPIO, ServiceHandler.POST, params);