子类Activity继承父类Activity重写的方法执行混乱

细嗅v蔷薇 2018-04-17 07:39:43
我在项目中写了一个Activity的基类BaseActivity,所有的activity都继承自这个方法,在BaseActivity中做了一个新消息的回调监听,之后交给另一个方法去执行,父类并没有实现这个方法,我是在ActivityHomePage这个activity中重写了父类的方法,但是实际运行的时候并没有执行,而是在另一个我并没有实现这个方法的activity中执行了。
我表达的可能不清楚,一下是我的部分代码:
这个是我定义的父类

public abstract class BaseActivity extends AppCompatActivity implements TIMMessageListener{
public void dealMessage(List<TIMMessage> messageList){
//父类里面没有具体实现
LogUtils.LogI("父类的处理方法,"+this.getClass());
}
//监听新消息
@Override
public boolean onNewMessages(List<TIMMessage> list) {
LogUtils.LogI("新消息:"+list.size());
dealMessage(list);
return false;
}
}


下面是第一个Activity,我并没有在这个activity执行dealMessage方法

public class ActivityGuidePage extends BaseActivity{
//这里只是一个欢迎页,没有执行dealMessage方法
}


下面是我具体想要实现dealMessage方法的activity,但是在这里却没有执行,这里面重写了父类的dealMessage方法,但是没有执行

public class ActivityHomePage extends BaseActivity {
@Override
public void dealMessage(List<TIMMessage> messageList) {
super.dealMessage(messageList);
//新消息到达之后将新消息显示出来
LogUtils.LogI("Activity开始处理消息");
for(TIMMessage timMessage : messageList){
for(int i = 0; i < timMessage.getElementCount(); i++){
if(timMessage.getElement(i).getType() == TIMElemType.Text){
TIMTextElem textElem = (TIMTextElem) timMessage.getElement(i);
//文本消息,将文本消息添加到聊天框中
fragmentChat.addTextMessage(textElem,timMessage.isSelf());
}

}
}
}
}


打印log发现,dealMessage在ActivityGuidePage了,麻烦大神看下到底是回事!
...全文
1602 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
细嗅v蔷薇 2018-04-18
  • 打赏
  • 举报
回复
引用 4 楼 Jing丶无双的回复:
private TIMMessageListener listener;//首先我认为你会在某个class里面放置一个监听

listener=this;//然后初始化它


List<TIMMessage> list=new ArrayList<TIMMessage>();//当有新消息来时把它们整理到某个集合
...
...//经过一系列数据处理

listener.onNewMessages(list);//最终通过最先放置的监听回调onNewMessages方法
因此这么看来这里的初始化的this才是关键,如果你这里的this是ActivityGuidePage那么你的日志肯定会打在ActivityGuidePage中。而如果你这里初始化的TIMMessageListener 监听与ActivityHomePage毫无关系,那么自然不会回调到ActivityHomePage
我是这样想的,就是当有新消息的时候,我希望能够实时监听到,所以我给baseactivity实现了这个接口,这样当有新消息的时候,不管我当前在哪个activity,都可以监听到新消息,之后所有的activity都继承自baseactivity,因为我只希望在activityhomepage中将新的消息显示给用户,所以在activityhomepage中重写了baseactivity中定义的dealmessage方法,在其他的activity中都没有重写这个方法,但是当有新消息的时候,baseactivity监听到了有新消息,同时执行了baseactivity中的dealmessage方法,但是这个方法并没有在activityhomepage中继续执行,而是跑到了activityguidepage中执行了,但是我并没有在activityguidepage重写这个方法啊!
细嗅v蔷薇 2018-04-18
  • 打赏
  • 举报
回复
引用 5 楼 拍砖哥的回复:
引用 3 楼 ffa_ijj 的回复:
[quote=引用 1 楼 qq_20330595 的回复:] 乍一看没毛病 重写方法是java基础 没必要怀疑他的真实性。
但是在ActivityHomePage中没有执行重写的父类的方法,在ActivityGuidePage中我没有重写父类的方法,却执行了,很奇怪的问题
ActivityGuidePage 没有重写如何执行了呢? 是在BaseActivity中执行了吧? 有点你要清楚 只有设置了LIstener才会有回调 而不是所有的子类都会回调哦 想达到一经回调所有子类响应 就必须在BaseActivity中的Oncreate方法中设置setListener方法。[/quote] 那这个setlistener如何设置呢,我已经让baseacticity实现了新消息到达的接口timmessagelistener
细嗅v蔷薇 2018-04-18
  • 打赏
  • 举报
回复
引用 5 楼 拍砖哥的回复:
引用 3 楼 ffa_ijj 的回复:
[quote=引用 1 楼 qq_20330595 的回复:] 乍一看没毛病 重写方法是java基础 没必要怀疑他的真实性。
但是在ActivityHomePage中没有执行重写的父类的方法,在ActivityGuidePage中我没有重写父类的方法,却执行了,很奇怪的问题
ActivityGuidePage 没有重写如何执行了呢? 是在BaseActivity中执行了吧? 有点你要清楚 只有设置了LIstener才会有回调 而不是所有的子类都会回调哦 想达到一经回调所有子类响应 就必须在BaseActivity中的Oncreate方法中设置setListener方法。[/quote] 是的,是在baseactivity中执行了,但是通过打印this却发现是在activityguidepage中执行了!
Android小码家 2018-04-18
  • 打赏
  • 举报
回复
引用 3 楼 ffa_ijj 的回复:
引用 1 楼 qq_20330595 的回复:
乍一看没毛病 重写方法是java基础 没必要怀疑他的真实性。
但是在ActivityHomePage中没有执行重写的父类的方法,在ActivityGuidePage中我没有重写父类的方法,却执行了,很奇怪的问题
ActivityGuidePage 没有重写如何执行了呢? 是在BaseActivity中执行了吧? 有点你要清楚 只有设置了LIstener才会有回调 而不是所有的子类都会回调哦 想达到一经回调所有子类响应 就必须在BaseActivity中的Oncreate方法中设置setListener方法。
Jing丶無雙 2018-04-18
  • 打赏
  • 举报
回复
private TIMMessageListener listener;//首先我认为你会在某个class里面放置一个监听

listener=this;//然后初始化它


List<TIMMessage> list=new ArrayList<TIMMessage>();//当有新消息来时把它们整理到某个集合
...
...//经过一系列数据处理

listener.onNewMessages(list);//最终通过最先放置的监听回调onNewMessages方法
因此这么看来这里的初始化的this才是关键,如果你这里的this是ActivityGuidePage那么你的日志肯定会打在ActivityGuidePage中。而如果你这里初始化的TIMMessageListener 监听与ActivityHomePage毫无关系,那么自然不会回调到ActivityHomePage
细嗅v蔷薇 2018-04-18
  • 打赏
  • 举报
回复
引用 1 楼 qq_20330595 的回复:
乍一看没毛病 重写方法是java基础 没必要怀疑他的真实性。
但是在ActivityHomePage中没有执行重写的父类的方法,在ActivityGuidePage中我没有重写父类的方法,却执行了,很奇怪的问题
键盘舞者113 2018-04-18
  • 打赏
  • 举报
回复
项目上传,链接给我
细嗅v蔷薇 2018-04-18
  • 打赏
  • 举报
回复
引用 9 楼 Jing丶无双的回复:
实现了接口,还要有个能调这个接口中的方法才行,不是说实现了接口,接口中的某个方法自己就执行了。所以关键看你如何调用接口中的方法
这个接口是腾讯云通信提供的接口,我在baseactivity实现了这个接口,自然也就实现了这个方法,有新消息的时候,云通信的sdk会回调这个方法,这样我在baseacticiry就能接受到新消息了,现在的问题是我需要的那个之类重写了相关方法却没有执行
Jing丶無雙 2018-04-18
  • 打赏
  • 举报
回复
实现了接口,还要有个能调这个接口中的方法才行,不是说实现了接口,接口中的某个方法自己就执行了。所以关键看你如何调用接口中的方法
Android小码家 2018-04-17
  • 打赏
  • 举报
回复
乍一看没毛病 重写方法是java基础 没必要怀疑他的真实性。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧