Android 异步任务内存泄漏

Android 异步任务内存泄漏,android,memory-leaks,android-asynctask,Android,Memory Leaks,Android Asynctask,我似乎在执行以下异步任务时出现内存泄漏,可能的原因是什么 /** * Async task class to get json by making HTTP call * */ public class PostLocation extends AsyncTask<String, Void, String> { @Override protected void onPreExecute() { } @Override prote

我似乎在执行以下异步任务时出现内存泄漏,可能的原因是什么

/**
 * Async task class to get json by making HTTP call
 * */
public class PostLocation extends AsyncTask<String, Void, String>
{

    @Override
    protected void onPreExecute()
    {

    }
    @Override
    protected String doInBackground(String... params)
    {
        try
        {
            String response = "";



            URL url = new URL(BASE_URL + "receiveLocation.php");

            myConnection = (HttpURLConnection) url.openConnection();
            myConnection.setRequestMethod("POST");
            myConnection.setDoOutput(true);

            DataOutputStream wr = new DataOutputStream(myConnection.getOutputStream());

            wr.writeBytes(params[0]);
            int responseCode = myConnection.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK)
            {
                String line;
                BufferedReader br = new BufferedReader(new InputStreamReader(myConnection.getInputStream()));
                while ((line = br.readLine()) != null)
                {
                    response += line;
                }
            }
            else
            {
                return response = "";
            }
            return response;


        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "false";
        }
    }
    @Override
    protected void onPostExecute(String result)
    {
        if(result.equals("success"))
        {
            myConnection.disconnect();
        }


    }

}
/**
*异步任务类通过HTTP调用获取json
* */
公共类后定位扩展了异步任务
{
@凌驾
受保护的void onPreExecute()
{
}
@凌驾
受保护的字符串doInBackground(字符串…参数)
{
尝试
{
字符串响应=”;
URL=新URL(BASE_URL+“receiveLocation.php”);
myConnection=(HttpURLConnection)url.openConnection();
myConnection.setRequestMethod(“POST”);
myConnection.setDoOutput(true);
DataOutputStream wr=新的DataOutputStream(myConnection.getOutputStream());
wr.writeBytes(参数[0]);
int responseCode=myConnection.getResponseCode();
if(responseCode==HttpsURLConnection.HTTP\u确定)
{
弦线;
BufferedReader br=新的BufferedReader(新的InputStreamReader(myConnection.getInputStream());
而((line=br.readLine())!=null)
{
响应+=行;
}
}
其他的
{
返回响应=”;
}
返回响应;
}
捕获(例外e)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
返回“false”;
}
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
如果(结果等于(“成功”))
{
myConnection.disconnect();
}
}
}

这只是将一些数据发布到我的服务器。可能导致内存泄漏的原因,请注意,此任务是在后台使用goAsync从广播接收器调用的。这里的问题在于您的类结构

嵌套类应尽可能声明为静态的,否则会将封闭类保留在内存中,导致内存泄漏

更改:

public class PostLocation extends AsyncTask<String, Void, String>
public类PostLocation扩展异步任务
致:

公共静态类PostLocation扩展异步任务
以下是一个练习:

  • 在BroadcastReceiver类中放置一个名为
    boolean test
    的字段
  • 现在在嵌套类中,尝试访问此字段,例如
    test==true

如果嵌套类不是静态的,则可以访问该字段。这是因为类的实例保留了对封闭类的引用。但是如果将
PostLocation
类设置为静态,则该字段将不可用。

是的,您需要先关闭inputstream,然后关闭httpconnection。根据

每个HttpURLConnection实例用于发出单个请求,但 与HTTP服务器的底层网络连接可能是 被其他实例透明地共享。调用close()方法 在HttpURLConnection的InputStream或OutputStream上 请求可能释放与此实例关联的网络资源,但 对任何共享的持久连接都没有影响。呼叫 断开连接()方法可能会关闭基础套接字,如果持久性 否则,此时连接处于空闲状态


添加logcat将提供有关问题的更多信息,请添加它。该类是放置在单独的.java文件中还是嵌套类?@Kelevandos它是我的广播接收器中的内部类请查看答案考虑其他答案如果该类是静态的,我无法像上面那样关闭连接,或者我只是使连接和输入流保持静态?在
br.close()之前尝试关闭之前<代码>返回响应
doInBackground
中,我在这里回答这两个问题,但是每次调用此任务都会增加大约0.1 mb的ram使用量,并且此调用每3分钟运行一次,如果我删除此调用,它不会增加我在这里回答这两个问题,但是每次调用此任务都会增加大约0.1 mb的ram使用量,并且此调用每3分钟运行一次,如果我取消呼叫,它不会增加
public static class PostLocation extends AsyncTask<String, Void, String>