android – 在onPause之后触发的OnClickListener?

android – 在onPause之后触发的OnClickListener?,第1张

概述我正在使用的项目使用视图展示器抽象. 这是所有主要类的简化版本. 抽象活动(Wire Presenter实例,带View) public abstract class MvpActivity<Presenter extends MvpPresenter> extends ActionBarActivity { protected Presenter mPresenter; 我正在使用的项目使用视图展示器抽象.
这是所有主要类的简化版本.

抽象活动(Wire Presenter实例,带VIEw)

public abstract class MvpActivity<Presenter extends MvpPresenter>        extends ActionBaractivity {  protected Presenter mPresenter;  @OverrIDe protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    mPresenter = getPresenterInstance();  }  @OverrIDe protected voID onResume() {    super.onResume();    mPresenter.onResume(this);  }  @OverrIDe protected voID onPause() {    mPresenter.onPause();    super.onPause();  }}

视图界面

public interface MyVIEw {  voID redirect();}

视图实现

public class MyActivity        extends MvpActivity<MyPresenter>        implements MyVIEw {  @OverrIDe protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.my_vIEw);    button mybutton = (button)findVIEwByID(R.ID.my_button);    mybutton.setonClickListener(v -> mPresenter.onbuttonpressed());  }  @OverrIDe protected MyPresenter getPresenterInstance() {    return new MyPresenter();  }  @OverrIDe voID redirect(){    startActivity(new Intent(this,MyOtherActivity.class));  }

抽象的主持人

public abstract class MvpPresenter<VIEwType> {  private VIEwType mVIEw;  public voID onResume(VIEwType vIEw) {    mVIEw = vIEw;  }  public voID onPause() {    mVIEw = null;  }  protected VIEwType getVIEw() {    if (mVIEw == null) {      throw new IllegalStateException("Presenter vIEw is null");    }    return mVIEw;  }}

和演示者实现

public class MyPresenter extends MvpPresenter<MyVIEw> {  @OverrIDe public voID onResume(MyVIEw myVIEw){    super.onResume(myVIEw);    Log.("MyPresenter","Presenter resumed");  }  @OverrIDe public voID onPause(){    super.onPause()    Log.("MyPresenter","Presenter paused");  }  public voID onbuttonpressed(){    getVIEw().redirect();  }}

问题出现在getVIEw()触发的“IllegalStateException:Presenter视图为空”.redirect();从MyPresenter.onbuttonpressed()方法调用时.

这对我没有任何意义,因为如果侦听器被触发,视图应始终不为null.如果执行仅从MvpActivity.onPause()调用的MvpPresenter.onPause(),则视图仅设置为null.发生这种情况后,我不希望收到任何点击事件,所以我在这里缺少什么?

遗憾的是,我无法通过手动测试应用程序来重现此问题.这些报道来自Crashlytics.

注意:retrolambda用于按钮单击侦听器

更新10/07/2017

解决此问题的一些方法:


https://developer.android.com/reference/android/view/View.html#cancelPendingInputEvents()


https://github.com/JakeWharton/butterknife/blob/master/butterknife/src/main/java/butterknife/internal/DebouncingOnClickListener.java

解决方法 简短的回答:不要这样做.

不幸的是,您依赖的是未定义的事件顺序.活动生命周期事件和窗口事件是两个不同的事情,即使它们通常密切相关.当活动因任何原因暂停时,您将获得onPause().但VIEw视图窗口失去焦点后,VIEw触摸事件不会被取消.

当一个活动窗口失去焦点时,例如当屏幕被锁定或启动另一个活动时,它就会非常常见.但正如您所见,您可以在没有焦点变化的情况下暂停,并且可以不停顿地进行焦点更改.即使两个事件一起发生,当调用onPause()但窗口输入处理程序仍处于活动状态时,会有一个很窄的时间窗口.

与任何未定义的行为一样,您看到的实际结果将因 *** 作系统版本和硬件类型而异.

如果您需要确保在onPause之后没有收到VIEw消息,则应该在onPause中取消挂钩处理程序.

总结

以上是内存溢出为你收集整理的android – 在onPause之后触发的OnClickListener?全部内容,希望文章能够帮你解决android – 在onPause之后触发的OnClickListener?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1131365.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存