【问题标题】:OutOfMemoryError by using java.util.Timer使用 java.util.Timer 的 OutOfMemoryError
【发布时间】:2014-08-13 07:02:28
【问题描述】:
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);
    }
}

定时器任务调用的方法

void handleTimeout(){
    Handler mainHandler = new Handler(mContext.getMainLooper());
    Runnable runnable = new Runnable(){

            @Override
            public void run() {
                sync(); //call the sync
            }
        };
        mainHandler.post(runnable);
    }

从这里我得到了以下来自 Play 商店的报告

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 释放它时出现此错误。 谢谢你的帮助。

【问题讨论】:

  • 是..在特定时间后同步数据
  • 你经常使用这些计时器吗?问题是您不能强制 GC 收集您的对象,您只能建议它。
  • 我认为几秒钟只是在主线程中调用另一个方法。
  • 看来您在太短的时间内创建了太多线程。你可能不得不重新考虑你这样做的技巧。
  • 你为什么不断地创建新的Timer-objects 而不是重复使用你已经拥有的?

标签: java android timer android-asynctask timertask


【解决方案1】:

我建议在 android 中使用 Handler 而不是 Timer,因为它可能会在您的应用程序中导致 memory leaks

样本:

  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);

  }

【讨论】:

  • 如果我多次调用 scheduleSyncIn() 方法,也有可能出现 OutOfMemoryError 异常,所以我认为最好只初始化一次 mHandler ......这是我的意见,如果你分享你的观点,我很高兴...谢谢
  • @nikhil 为什么在处理程序为您执行此操作时多次调用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
相关资源
最近更新 更多