【问题标题】:An interesting way of communication between two activities两种活动之间的一种有趣的交流方式
【发布时间】:2016-03-01 16:44:18
【问题描述】:

第一步:

public class MyHandler extends Application {
    private Handler handler = null;

    public Handler getHandler() {
        return handler;
    }

    public void setHandler(Handler handler) {
        this.handler = handler;
    }

}

下一步: 在活动 A 中:

MyHandler myHandler = (MyHandler)getApplication();
    Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            if(msg.what == 0x123)
                progressDialog.dismiss();
        }
    };
    myHandler.setHandler(handler);

在活动 B 中:

MyHandler myHandler = (MyHandler)getApplication();
Handler handler = myHandler.getHandler();
handler.sendEmptyMessage(0x123);

虽然两个myHandler的引用是一样的,但是我们用(MyHandler)把Application改成MyHandler。Application没有handler字段,为什么Application可以保留字段handler呢?因为我认为在活动B中,MyHandler myHandler = (MyHandler)getApplication();无法获取归档处理程序。

【问题讨论】:

  • 为什么不用onActivityResult机制?
  • 你的清单中有<application android:name=".MyHandler" ...> 吗?
  • 是的,我有 在你的清单中,但我的问题是为什么应用程序可以保留归档的处理程序?

标签: java android android-handler


【解决方案1】:

多态性。

Application 类型的 reference 并不一定意味着 referenced object 是。该对象可以是ApplicationApplication 的任何子类。

在一个值之前写(MyHandler) 是一个cast,并且只是转换reference,而不是object。在运行时检查强制转换的有效性,如果对象不是 MyHandler 或其子类(在您的情况下,检查通过,所以没问题),将抛出 ClassCastException

【讨论】:

  • Application没有handler字段,为什么Application可以保留字段handler?活动 B 中的 MyHandler 与活动 A 中的不一样,我认为,因为应用程序没有处理程序字段。
  • 阅读 Java 中的多态性(继承/子类化)和引用。
  • 我认为你的意思是将子类转换为超类,但是当我将超类转换为子类时,我认为它们应该具有相同的引用,并且超类不能使用只属于的字段到他的子类。
  • 你没有改变实际的对象,只是reference的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2012-04-12
  • 2020-12-01
  • 1970-01-01
  • 2016-12-02
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多