使用java.util.Timer时发生OutOfMemoryError
由计时器任务调用的方法使用java.util.Timer时发生OutOfMemoryError,java,android,timer,android-asynctask,timertask,Java,Android,Timer,Android Asynctask,Timertask,由计时器任务调用的方法 Timer mTimer; void scheduleSyncIn(int aSeconds){ if (mTimer != null) { mTimer.cancel(); mTimer = null; } mTimer = new Timer(); TimerTask task = new TimerTask() { @Override public void run(
Timer mTimer;
void scheduleSyncIn(int aSeconds){
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
mTimer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
handleTimeout();
}
};
if (request) {
mTimer.schedule(task, aSeconds * 1000);
}
}
从这里我从play store得到了以下报告
void handleTimeout(){
Handler mainHandler = new Handler(mContext.getMainLooper());
Runnable runnable = new Runnable(){
@Override
public void run() {
sync(); //call the sync
}
};
mainHandler.post(runnable);
}
java.lang.OutOfMemoryError:pthread_创建(堆栈大小16384字节)失败:重试
创建(本机方法)
在java.lang.Thread.start(Thread.java:1029)处
位于java.util.Timer$TimerImpl.(Timer.java:192)
在java.util.Timer.(Timer.java:367)
在java.util.Timer.(Timer.java:387)
在java.util.Timer.(Timer.java:394)
位于com.example.Manager.scheduleSyncIn(Manager.java:66)
位于com.example.Manager.scheduleSync(Manager.java:56)
在com.example.Manager.RequestDone上(Manager.java:180)
com.example.Manager.Remote$GetMetaData.onPostExecute(Remote.java:338)
位于com.example.Manager.Remote$GetMetaData.onPostExecute(Remote.java:1)
位于android.os.AsyncTask.finish(AsyncTask.java:632)
在android.os.AsyncTask.access$600(AsyncTask.java:177)
位于android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:136)
位于android.app.ActivityThread.main(ActivityThread.java:5137)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
在dalvik.system.NativeStart.main(本机方法)
现在我不知道为什么这个错误,而我取消计时器,并释放它的GC每次初始化之前。
谢谢你的帮助 我建议在android中使用
处理程序
而不是计时器
,这可能会在应用程序中造成问题
示例:
java.lang.OutOfMemoryError: pthread_create (stack size 16384 bytes) failed: Try again
at java.lang.VMThread.create(Native Method)
at java.lang.Thread.start(Thread.java:1029)
at java.util.Timer$TimerImpl.<init>(Timer.java:192)
at java.util.Timer.<init>(Timer.java:367)
at java.util.Timer.<init>(Timer.java:387)
at java.util.Timer.<init>(Timer.java:394)
at com.example.Manager.scheduleSyncIn(Manager.java:66)
at com.example.Manager.scheduleSync(Manager.java:56)
at com.example.Manager.RequestDone(Manager.java:180)
com.example.Manager.Remote$GetMetaData.onPostExecute(Remote.java:338)
at com.example.Manager.Remote$GetMetaData.onPostExecute(Remote.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5137)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)
对要在特定时间后同步数据,您是否使用了大量此类计时器?问题是你们不能强迫GC收集你们的对象,你们只能建议它。我想几秒钟就可以在主线程中调用另一个方法。看起来你们在太短的时间内创建了太多的线程。您可能需要重新考虑执行此操作的技术。为什么要不断创建新的
计时器
-对象,而不是重用已有的对象?如果我多次调用scheduleSyncIn()方法,也有可能出现OutOfMemoryError异常,所以我认为最好只初始化一次mHandler…这是我的观点,如果你同意你的观点,我会很高兴。。。thanks@nikhil当处理程序为您执行此操作时,为什么要多次调用它
Handler mHandler;
Runnable mRunnable;
void scheduleSyncIn(int aSeconds){
mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
mHandler.postDelayed(mRunnable, aSeconds);
}
};
mHandler.postDelayed(mRunnable, aSeconds);
}