【问题标题】:Is there a better way to detect when Preference is not visible and then stop my Handler有没有更好的方法来检测 Preference 何时不可见然后停止我的 Handler
【发布时间】:2019-08-12 11:15:20
【问题描述】:

我有一个基本的Preference 子类,其中有一个Handler。它会每秒触发一次,但如果自定义Preference 不再可见,它不会停止。

<PreferenceCategory
    android:layout="@layout/pref_category_text"
    android:title="@string/pref_category_stat_out_title">

    <com.sunlux.smartpower.extended.preferences.ShowStatPreference android:key="@string/pref_key_show_stat" />
</PreferenceCategory>


public class ShowStatPreference extends Preference {

    private long MEGABYTE = 1024L * 1024L;
    private TextView bytesStat;
    private Handler mHandler;

    /**
     * Timer for updating stat
     */
    private final Runnable statRunnable = new Runnable() {
        @Override
        public void run() {
            setStatSomething();
            startStatTimer();
        }
    };

    public ShowStatPreference(Context context) {
        super(context);
    }

    public ShowStatPreference(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ShowStatPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setWidgetLayoutResource(R.layout.show_stat_preference);
        mHandler = new Handler();
        startStatTimer();
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        holder.itemView.setClickable(false); // disable parent click
        bytesStat = (TextView) holder.findViewById(R.id.bytes);
        super.onBindViewHolder(holder);
    }

    private void startStatTimer() {
        mHandler.postDelayed(statRunnable, 1000);
    }

    private void setStatSomething(){
        // do stuff
    }
}

当我更改PagerAdapter 中的选项卡或应用程序正在关闭时,我可以通过侦听器发送消息使其停止。

这是我唯一选择的吗?

有什么想法吗?

【问题讨论】:

    标签: java android android-preferences android-handler


    【解决方案1】:

    当您的设置页面关闭时,您可以使用onDetached() 删除处理程序。像这样的:

    @Override public void onDetached() {
      super.onDetached();
      mHandler.removeCallbacks(statRunnable);
    }
    

    【讨论】:

    • 谢谢,但是在我的'FragmentPagerAdapter'中我有5个'Fragment'并且'getCount()'返回5,所以'PreferenceFragmentCompat'永远不会被删除。我想我会选择 greenrobot:eventbus
    • 这是使用 greenrobot:eventbus 的肮脏解决方案吗?
    • 由于我已经设置了延迟处理程序,当每秒触发一次时,它可以读取由“ViewPager”设置的 som 全局变量,这将判断它是否是当前可见的“片段”对吗?
    • Is that a dirty solution using greenrobot:eventbus? 是的,您的偏好将取决于 EventBus。
    • Since I have the Handler on delay already set up, when that fire every second it could read som global variable that was set by the 'ViewPager', that will tell if its the current visible 'Fragment' right? 应该可以工作,但偏好仍然依赖于 ViewPager。在onBindViewHolder 中聆听您的视图可见性变化如何?见stackoverflow.com/questions/32777597/…
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2014-08-31
    • 2023-03-27
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2013-08-18
    相关资源
    最近更新 更多