Fragment中使用Handler定时调用takepicture()方法未执行问题求助
哦,我一眼就瞅到问题所在了——你只定义了Handler和Runnable,但从来没触发第一次执行呀!
核心问题分析
Handler的工作逻辑是:你必须先把Runnable投递到它的消息队列里,它才会去执行run()方法。你现在的代码只是创建了这两个对象,但没有调用handler.post(r)或者handler.postDelayed(r, 0)来启动第一次执行,所以run()方法自然永远不会被触发,更别说后续的循环调用了。
修复后的代码示例
另外还要注意:把Handler和Runnable改成Fragment的成员变量(别放在onActivityCreated的局部作用域里),不然很容易被GC回收,导致后续的循环调用失效;同时要在Fragment销毁时清理回调,防止内存泄漏。
public class YourFragment extends Fragment { private File mFile; private Handler mHandler; private Runnable mTakePictureRunnable; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mFile = new File(getActivity().getExternalFilesDir(null), "pic.jpg"); mHandler = new Handler(); mTakePictureRunnable = new Runnable() { @Override public void run() { Log.d("HandlerThread","This is from the HandlerThread"); takePicture(); // 每隔60秒重复调用自身 mHandler.postDelayed(this, 60000); } }; // 关键!发起第一次执行,启动循环 mHandler.post(mTakePictureRunnable); } private void takePicture() { // 这里写你的拍照逻辑 } @Override public void onDestroyView() { super.onDestroyView(); // 销毁时移除所有未执行的回调,防止内存泄漏 if (mHandler != null && mTakePictureRunnable != null) { mHandler.removeCallbacks(mTakePictureRunnable); } } }
额外说明
- 成员变量的必要性:如果把Handler和Runnable放在
onActivityCreated的局部变量里,方法执行完后这些对象可能被GC回收,导致后续的postDelayed无法正常触发循环。 - 内存泄漏防护:在Fragment的
onDestroyView(或onDestroy)方法里调用removeCallbacks,可以确保Fragment销毁后,Handler不会再持有Fragment的引用,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Monica Das
相关产品推荐
相关产品推荐

