我经常使用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吗?
感谢:)
答案 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();
}