【问题标题】:Android Interfaces and onCreate()Android 接口和 onCreate()
【发布时间】:2012-07-31 15:29:12
【问题描述】:

这是一个关于在 Activity 中使用接口的双重问题 - 即 onclickListener(和相关的)。

  1. onCreate 应该很短 - 文档如是说 - 但如果我有很多很多视图,所有这些视图都具有 onClickListeners,它可能会变得很长。我担心这会导致 UI 线程超时。这是个问题吗?
  2. 有没有使用 onClickListener 的最佳方式?我的意思是,Activity 实现 onCLickListener 然后有一个很长的 onClick() 方法会更好吗?或执行以下操作:

    mView.setOnClickListener(new OnClickListener(){
       ...
     });
    

对于每个视图?它真的有什么不同吗?

【问题讨论】:

    标签: android interface onclicklistener


    【解决方案1】:
    1. 它们的意思是“短”,因为在onCreate() 中不会做任何需要很长时间才能处理的事情。像数学计算、网络或数据库访问、超大位图膨胀等任何事情都应该在一个线程中完成。将onClickListener 设置为视图的唯一开销是调用方法、设置引用以及通常创建对象。如果对象创建执行上述任何操作,那么最好在创建对象之前预加载它。

    2. 没有真正的区别。您选择什么完全取决于您的实施和编码风格。使用像您展示的匿名对象有点像“一劳永逸”的方式。如果该操作是按钮独有的,则它是合适的。如果需要在每次点击时保持状态,则需要创建一个实现 onClickListener() 的全新类。这样,您只需创建一次对象并将所有必要的视图设置为单个对象。如果许多视图在单击时执行相同的操作,则以这种方式执行此操作也可能很有用。

    【讨论】:

      【解决方案2】:

      它不应该为加载您的活动而烦恼,因为 onClick 侦听器中的代码仅在对其视图进行点击时才会执行。

      此外,在 onCreate 中执行繁重的东西(网络、数据库、可绘制操作等)并不是一个好主意。如果您确实需要进行此类处理,请将其卸载到AsyncTask,该AsyncTask 在单独的线程中运行您的代码,从而使您的 UI(主)线程空闲。

      【讨论】:

        【解决方案3】:

        1) 我同意 Deev 的回答。

        2) 请注意,如果您选择使用匿名内部类解决方案

        mView.setOnClickListener(new OnClickListener(){
        ...
        });
        

        您为每个分配创建一个对象。 相反,如果您在活动中实现OnClickListener,您将不会创建任何其他对象。这对于少量对象并没有太大的区别,但可以为大量对象(你说有很多很多)节省一些内存(并从 GC 中拯救你)。 Designing for Performance

        建议避免创建无用的对象

        【讨论】:

        • 创建对象有一些开销,但我认为总体效果会产生微乎其微的差异。大多数情况下,OnClickListener() 在 View 创建时创建一次,并且在 View 本身存在时仍然存在。这意味着只有在视图被销毁时,GC 才会运行并删除 OnClickListener(),这会产生更多开销。如果在优化阶段有什么让你放慢了速度,请记住这一点。
        • 我们同意这在正常情况下没什么大不了的。我提到完整性也是因为他说有很多观点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多