这个Asynctask能否导致Android上的OutOfMemory?

时间:2017-10-10 05:57:14

标签: java android android-asynctask

我经常使用AsyncTask因为 AsyncTask有ThreadPool,

所以即使线程无限增长,也可以管理内存以避免压力。

但是,最近发生了OutOfMemoryError: pthread_create (1040KB stack) failed: Try again

所以,我找到了可疑部分。

public static class getPubIpAddress extends AsyncTask<Void, Void ,String> {

      @Override
      protected void onPreExecute() {
         super.onPreExecute(); 
      }

      @Override
      protected String doInBackground(Void... params) {
          try {
              URL pubIp = new URL("https://myserver.co.kr/ipaddr.php");
              BufferedReader in = BufferedReader(new InputStreamReader(
                       pubIp.openStream()));
              String pub = in.readLine();
          } catch (Exception e) {
              e.printStackTrace();
          }
          return pub;
       }
       @Override
       protected void onPostExecute(String result) {
          super.onPostExecute(result);
       }
}

这个asynctask获取公共IP。 并在网络连接时执行,更改网络。

这个asynctask会导致android上的outofmemory吗?

感谢:)

1 个答案:

答案 0 :(得分:1)

我认为问题可能是asynctask一次又一次地运行。你必须检查asyncTask完成然后尝试重新运行它。 查看这篇文章。 Android, AsyncTask, check status?

第二种方法您可以在应用程序级别设置一个标志,以检查AsyncTask是否正在运行,如果不运行则不再启动AsyncTask,然后启动AsnckTask。

在应用程序级别类中放置此变量

public static boolean alreadyRuning = false;

还有这个getter和setter

 public static boolean isRunning() {
    return alreadyRuning;
}

public static void setRunning(boolean alreadyRunning) {
    this.alreadyRuning= alreadyRunning;
}

或者您可以在完成后关闭缓冲区。

BufferedReader in = BufferedReader(new InputStreamReader(
            pubIp.openStream()));
    try {
            String pub = in.readLine();
    } finally {
        in.close();
    }