Commit 19b956db by konghaorui

私聊模块 补充防止 Rxjava 内存泄露逻辑

parent aa09a02c
......@@ -20,8 +20,8 @@ import java.util.List;
public final class DemoGlobalConfig implements IConfigModule {
String APP_DOMAIN = "https://api.github.com/";
// public static String appEnv = YDLConstants.ENV_AUTO_TEST;
// public static String appEnv = YDLConstants.ENV_PROD;
public static String appEnv = YDLConstants.ENV_TEST;
public static String appEnv = YDLConstants.ENV_PROD;
// public static String appEnv = YDLConstants.ENV_TEST;
@Override
public void injectAppLifecycle(@NotNull Context context, @NotNull List<IAppLifecycles> lifecycles) {
......
......@@ -2,23 +2,24 @@ package com.yidianling.im.session.action;
import android.text.TextUtils;
import com.yidianling.nimbase.business.session.actions.BaseAction;
import com.yidianling.im.R;
import com.yidianling.im.http.ImHttpImpl;
import com.yidianling.im.http.ImRetrofitApi;
import com.yidianling.im.http.param.ExpertParam;
import com.yidianling.router.im.IMExpertBuild;
import com.ydl.webview.H5Params;
import com.ydl.webview.NewH5Activity;
import com.ydl.ydlcommon.base.lifecycle.ILifecycleable;
import com.ydl.ydlcommon.data.http.BaseResponse;
import com.ydl.ydlcommon.data.http.RxUtils;
import com.ydl.ydlcommon.data.http.ThrowableConsumer;
import com.ydl.ydlcommon.utils.remind.ToastHelper;
import com.yidianling.im.R;
import com.yidianling.im.http.ImHttpImpl;
import com.yidianling.im.http.ImRetrofitApi;
import com.yidianling.im.http.param.ExpertParam;
import com.yidianling.nimbase.business.session.actions.BaseAction;
import com.yidianling.router.im.IMExpertBuild;
import org.jetbrains.annotations.NotNull;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.disposables.Disposable;
/**
* author : Zhangwenchao
......@@ -35,10 +36,14 @@ public class OrderAction extends BaseAction {
@Override
public void onClick() {
ILifecycleable lifecycleable = null;
if (getActivity() instanceof ILifecycleable) {
lifecycleable = (ILifecycleable)(getActivity());
}
//先根据uid判断用户类型:专家调一个接口,非专家调另外的接口
ImRetrofitApi.Companion.getImJavaApi().getUserType(getAccount())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
Disposable dis = ImRetrofitApi.Companion.getImJavaApi().getUserType(getAccount())
.compose(RxUtils.applySchedulers(lifecycleable))
.subscribe(res -> {
if (res.code == 200) {
Observable<BaseResponse<IMExpertBuild>> observable;
......@@ -48,8 +53,8 @@ public class OrderAction extends BaseAction {
observable = ImHttpImpl.Companion.getInstance().getExpert(new ExpertParam(Integer.valueOf(getAccount()), 0));
}
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
Disposable disposable = observable
.compose(RxUtils.applySchedulers())
.subscribe(resp -> {
if (resp != null && resp.data != null && resp.data.shareData != null && !TextUtils.isEmpty(resp.data.shareData.order_url)) {
NewH5Activity.start(getActivity(), new H5Params(resp.data.shareData.order_url + "?search=" + resp.data.shareData.doctorName, "订单"));
......
......@@ -32,12 +32,12 @@ import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.header.MaterialHeader;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
/**
* 动态消息列表
*/
public class OtherMsgDetailActivity extends BaseActivity implements PtrHandler {
public class OtherMsgDetailActivity extends BaseActivity implements PtrHandler{
String title = "";
......@@ -106,7 +106,7 @@ public class OtherMsgDetailActivity extends BaseActivity implements PtrHandler {
store_house_ptr_frame.setPtrHandler(this);
store_house_ptr_frame.addPtrUIHandler(header);
adapter = new MsgListAdapter(this, type);
adapter = new MsgListAdapter(this, type,this);
lv_content.setAdapter(adapter);
lv_content.setEmptyView(ll_empty);
......@@ -118,9 +118,9 @@ public class OtherMsgDetailActivity extends BaseActivity implements PtrHandler {
private void allMarkReaded() {
showProgressDialog("");
httpHelper.updateRead(new ReadParam(type))
Disposable disposable = httpHelper.updateRead(new ReadParam(type))
.compose(RxUtils.applySchedulers(this))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(updateStatusBean -> {
dismissProgressDialog();
if (updateStatusBean != null) {
......@@ -147,9 +147,9 @@ public class OtherMsgDetailActivity extends BaseActivity implements PtrHandler {
page = 1;
}
httpHelper.getMsgList(new MsgListParam(page + "", type))
Disposable dis = httpHelper.getMsgList(new MsgListParam(page + "", type))
.compose(RxUtils.applySchedulers(this))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(msgData -> {
LogUtil.d("data fetch compelete");
store_house_ptr_frame.refreshComplete();
......
......@@ -28,11 +28,12 @@ import in.srain.cube.views.ptr.PtrHandler;
import in.srain.cube.views.ptr.header.MaterialHeader;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
/**
* 系统消息列表
*/
public class SystemMsgDetailActivity extends BaseActivity implements PtrHandler {
public class SystemMsgDetailActivity extends BaseActivity implements PtrHandler{
PtrFrameLayout store_house_ptr_frame;
ListView lv_content;
......@@ -99,9 +100,9 @@ public class SystemMsgDetailActivity extends BaseActivity implements PtrHandler
}
ImHttp httpHelper = ImHttpImpl.Companion.getInstance();
httpHelper.getSysMsgList(new MsgListParam(page + "", type))
Disposable disposable = httpHelper.getSysMsgList(new MsgListParam(page + "", type))
.compose(RxUtils.applySchedulers(this))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(systemMsgBeans -> {
store_house_ptr_frame.refreshComplete();
if (systemMsgBeans.isEmpty()) {
......@@ -112,7 +113,7 @@ public class SystemMsgDetailActivity extends BaseActivity implements PtrHandler
newTemps.addAll(adapter.getDataList());
adapter.update(newTemps);
if (!loadMore) {
Observable.timer(300, TimeUnit.MILLISECONDS)
Disposable dis = Observable.timer(300, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> {
//滚动到底部
......
......@@ -10,6 +10,7 @@ import com.ydl.webview.H5Params;
import com.ydl.webview.NewH5Activity;
import com.ydl.ydlcommon.adapter.CommonAdapter;
import com.ydl.ydlcommon.base.BaseActivity;
import com.ydl.ydlcommon.base.lifecycle.ILifecycleable;
import com.ydl.ydlcommon.data.http.RxUtils;
import com.ydl.ydlcommon.data.http.ThrowableConsumer;
import com.ydl.ydlcommon.utils.StringUtils;
......@@ -28,13 +29,14 @@ import org.jetbrains.annotations.NotNull;
import java.util.Map;
import de.greenrobot.event.EventBus;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
/**
* 消息adapter
* Created by softrice on 15/12/10.
*/
public class MsgListAdapter extends CommonAdapter<MsgData> {
private ILifecycleable lifecycleable;
private Activity context;
private int type = 0;//消息类型
......@@ -44,9 +46,10 @@ public class MsgListAdapter extends CommonAdapter<MsgData> {
private ImHttp httpHelper;
public MsgListAdapter(Activity context, int type) {
public MsgListAdapter(Activity context, int type,ILifecycleable lifecycleable) {
this.context = context;
this.type = type;
this.lifecycleable = lifecycleable;
httpHelper = ImHttpImpl.Companion.getInstance();
}
......@@ -109,9 +112,9 @@ public class MsgListAdapter extends CommonAdapter<MsgData> {
if (fla || boo) {
//跟新未读
httpHelper.getMsgDetail(new MsgDetailParam(mDataList.get(position).id))
Disposable dis = httpHelper.getMsgDetail(new MsgDetailParam(mDataList.get(position).id))
.compose(RxUtils.applySchedulers(lifecycleable))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(msgDetail -> {
mDataList.get(position).is_read = 2;
notifyDataSetChanged();
......@@ -125,9 +128,9 @@ public class MsgListAdapter extends CommonAdapter<MsgData> {
return;//如果是动态消息则到此结束,其它消息类型走下面流程
}
((BaseActivity) context).showProgressDialog("正在中转");
httpHelper.getMsgDetail(new MsgDetailParam(mDataList.get(position).id))
Disposable di = httpHelper.getMsgDetail(new MsgDetailParam(mDataList.get(position).id))
.compose(RxUtils.applySchedulers(lifecycleable))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(msgDetail -> {
mDataList.get(position).is_read = 2;
((BaseActivity) context).dismissProgressDialog();
......
......@@ -159,10 +159,9 @@ class NewMultiMessageFragment : BaseFragment() {
*/
fun requestTopUnReadNumber() {
if (ImIn.getUserInfo()?.uid != "0") {
ImHttpImpl.getInstance().getUnreadMessage(UnreadParam("${ImIn.getUserInfo()?.uid}"))
var dis = ImHttpImpl.getInstance().getUnreadMessage(UnreadParam("${ImIn.getUserInfo()?.uid}"))
.compose<UnreadMessageBean>(RxUtils.resultJavaData())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxUtils.applySchedulers(this))
.subscribe({ it ->
resetTopUnReadNumber(it)
}, { t ->
......@@ -269,9 +268,8 @@ class NewMultiMessageFragment : BaseFragment() {
* 全部已读(私聊是单独处理的)
*/
fun markAllMessageRead() {
ImHttpImpl.getInstance().clearMessage(ClearMessageParam("${ImIn.getUserInfo()?.uid}", "1"))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
var dis = ImHttpImpl.getInstance().clearMessage(ClearMessageParam("${ImIn.getUserInfo()?.uid}", "1"))
.compose(RxUtils.applySchedulers(this))
.subscribe({ it ->
if (it.data) {
//清除私聊群聊未读数
......
......@@ -21,8 +21,6 @@ import com.yidianling.im.ui.page.widget.ChatUnusualView
import com.yidianling.im.ui.param.ChatParam
import com.yidianling.router.RouterManager
import de.greenrobot.event.EventBus
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.im_chat_fragment_layout.*
/**
......@@ -84,10 +82,9 @@ class ChatFragment : BaseFragment(), XRecyclerView.LoadingListener {
var selectType: Int = if (mChatModelType == ChatModelType.ALL) 0 else if (mChatModelType == ChatModelType.SERVICING) 1 else 2
if (ImIn.getUserInfo()?.uid != "0") {
ImHttpImpl.getInstance().getAllChatMessage(ChatParam("${ImIn.getUserInfo()?.uid}", "${selectType}"))
var dis = ImHttpImpl.getInstance().getAllChatMessage(ChatParam("${ImIn.getUserInfo()?.uid}", "${selectType}"))
.compose(RxUtils.applySchedulers(this))
.compose<ChatModelBean>(RxUtils.resultJavaData())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ it ->
if (it.before.data.size != 0 || it.nomal.data.size != 0) {
setData(it)
......@@ -207,7 +204,7 @@ class ChatFragment : BaseFragment(), XRecyclerView.LoadingListener {
private fun initListData() {
chatAdapter = ChatAdapter(context, showData)
chatAdapter = ChatAdapter(context, showData,this)
chatAdapter?.setlistener(object : ChatAdapter.ChatRecyclerViewCallback {
override fun onRefresh() {
getChatMessageData()
......
......@@ -19,8 +19,6 @@ import com.yidianling.im.ui.page.fragment.view.InteractFooterItemView
import com.yidianling.im.ui.page.widget.ChatUnusualView
import com.yidianling.im.ui.param.InteractMessageParam
import de.greenrobot.event.EventBus
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.im_interact_fragment.*
/**
......@@ -91,10 +89,9 @@ class InteractFragment : BaseFragment(), XRecyclerView.LoadingListener {
if (ImIn.getUserInfo()?.uid != "0") {
// 由于当前方法会因为各种因素多次调用,因此在接口返回值内判断只有在pageOn=1或者onLoadMore得时候,才将返回值加入展示列表中
ImHttpImpl.getInstance().getInteractMessage(InteractMessageParam("${ImIn.getUserInfo()?.uid}", "${requestPage}", "${pageSize}"))
var dis = ImHttpImpl.getInstance().getInteractMessage(InteractMessageParam("${ImIn.getUserInfo()?.uid}", "${requestPage}", "${pageSize}"))
.compose(RxUtils.applySchedulers(this))
.compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ it ->
interact_recyclerview.refreshComplete()
// 请求页面大于当前页面,才进行数据操作
......
......@@ -3,20 +3,18 @@ package com.yidianling.im.ui.page.fragment
import android.support.v7.widget.LinearLayoutManager
import android.view.View
import com.jcodecraeer.xrecyclerview.XRecyclerView
import com.ydl.ydlcommon.base.BaseFragment
import com.ydl.ydlcommon.data.http.RxUtils
import com.yidianling.common.tools.ToastUtil
import com.yidianling.im.R
import com.yidianling.im.event.MessageListRefreshEvent
import com.yidianling.im.http.ImHttpImpl
import com.yidianling.im.router.ImIn
import com.yidianling.im.ui.page.fragment.adapter.NoticeAdapter
import com.yidianling.im.ui.page.fragment.bean.NoticeItemBean
import com.yidianling.im.ui.page.widget.ChatUnusualView
import com.yidianling.im.ui.param.NoticeParam
import com.ydl.ydlcommon.base.BaseFragment
import com.yidianling.im.event.MessageListRefreshEvent
import com.ydl.ydlcommon.data.http.RxUtils
import de.greenrobot.event.EventBus
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.im_notice_fragment.*
/**
......@@ -58,10 +56,9 @@ class NoticeFragment : BaseFragment(), XRecyclerView.LoadingListener {
*/
fun getNoticeMessageData() {
if (ImIn.getUserInfo()?.uid != "0") {
ImHttpImpl.getInstance().getNoticeMessage(NoticeParam("${ImIn.getUserInfo()?.uid}"))
var dis = ImHttpImpl.getInstance().getNoticeMessage(NoticeParam("${ImIn.getUserInfo()?.uid}"))
.compose(RxUtils.applySchedulers(this))
.compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ it ->
noticeList.clear()
// content为空的不展示
......
......@@ -10,6 +10,7 @@ import android.view.ViewGroup
import com.netease.nimlib.sdk.NIMClient
import com.netease.nimlib.sdk.msg.MsgService
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum
import com.ydl.ydlcommon.base.lifecycle.ILifecycleable
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.utils.log.LogHelper
import com.ydl.ydlcommon.utils.remind.ToastHelper
......@@ -27,13 +28,12 @@ import com.yidianling.im.ui.page.fragment.bean.ChatItemBean
import com.yidianling.im.ui.page.fragment.view.ChatItemView
import com.yidianling.im.ui.page.fragment.view.ChatTimeItemView
import de.greenrobot.event.EventBus
import io.reactivex.android.schedulers.AndroidSchedulers
/**
* 互动列表适配器
* Created by xj on 2019/10/14.
*/
class ChatAdapter(var context: Context, private var mList: ArrayList<ChatItemBean>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
class ChatAdapter(var context: Context, private var mList: ArrayList<ChatItemBean>,private var lifecycleable: ILifecycleable<*>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
......@@ -138,9 +138,9 @@ class ChatAdapter(var context: Context, private var mList: ArrayList<ChatItemBea
private fun delete(bean: ChatItemBean) {
LogHelper.getInstance().writeLogSync("删除聊天:uid = " + bean.toUid)
ImHttpImpl.getInstance().rmHistory(RmHistoryParam(bean.toUid.toString(), 1))
var dis = ImHttpImpl.getInstance().rmHistory(RmHistoryParam(bean.toUid.toString(), 1))
.compose(RxUtils.applySchedulers(lifecycleable))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ o ->
LogHelper.getInstance().writeLogSync("删除聊天成功:uid = " + bean.toUid)
NIMClient.getService(MsgService::class.java).clearChattingHistory(bean.toUid.toString(), SessionTypeEnum.P2P)
......@@ -153,9 +153,9 @@ class ChatAdapter(var context: Context, private var mList: ArrayList<ChatItemBea
private fun deleteItem(bean: ChatItemBean) {
ImHttpImpl.getInstance().rmTalk(RmTalkParam(bean.toUid.toString()))
var dis = ImHttpImpl.getInstance().rmTalk(RmTalkParam(bean.toUid.toString()))
.compose(RxUtils.applySchedulers(lifecycleable))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ o ->
NIMClient.getService(MsgService::class.java).clearUnreadCount(bean.toUid.toString(), SessionTypeEnum.P2P)
NIMClient.getService(MsgService::class.java).clearUnreadCount(bean.toUid.toString(), SessionTypeEnum.Team)
......@@ -170,9 +170,9 @@ class ChatAdapter(var context: Context, private var mList: ArrayList<ChatItemBea
private fun toTop(bean: ChatItemBean, istop: Int) {
LogHelper.getInstance().writeLogSync("置顶聊天:uid = " + bean.toUid.toString() +
"取消置顶 = " + (istop == 0))
ImHttpImpl.getInstance().topMessage(TopMessageParam(bean.toUid.toString(), 1, istop))
var dis = ImHttpImpl.getInstance().topMessage(TopMessageParam(bean.toUid.toString(), 1, istop))
.compose(RxUtils.applySchedulers(lifecycleable))
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ o ->
LogHelper.getInstance().writeLogSync("置顶聊天成功:uid = " + bean.toUid.toString() +
"取消置顶 = " + (istop == 0))
......
......@@ -10,6 +10,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.ydl.ydlcommon.data.http.RxUtils;
import com.yidianling.common.tools.ToastUtil;
import com.yidianling.im.R;
import com.yidianling.nimbase.api.model.session.SessionCustomization;
......@@ -27,6 +28,7 @@ import java.net.URLEncoder;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
......@@ -139,9 +141,7 @@ public abstract class YDLBaseMessageActivity extends UI {
if (ActionHandlerStorage.getL(sessionId).getUserType() == 2) {
// 专家
// 调取接口获取专家状态
ServiceImpl.Companion.getInstance().getDoctorChatStatus(Long.parseLong(ActionHandlerStorage.getL(sessionId).getInfo().toUid))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
Disposable dis = ServiceImpl.Companion.getInstance().getDoctorChatStatus(Long.parseLong(ActionHandlerStorage.getL(sessionId).getInfo().toUid))
.subscribe(chatStatusBean -> {
int status = chatStatusBean.data.getStatus();
......
......@@ -2,6 +2,7 @@
package com.ydl.ydlcommon.data.http
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.base.lifecycle.ILifecycleable
import com.ydl.ydlcommon.mvp.base.IView
import com.ydl.ydlcommon.mvp.lce.ILceView
import com.ydl.ydlcommon.utils.RxLifecycleUtils
......@@ -89,6 +90,7 @@ object RxUtils {
* 自动调用 showLoading/hideLoading 方法
* @param view LceView 强转使用
*/
@JvmStatic
fun <T> applySchedulers(view: ILceView): ObservableTransformer<T, T> {
return ObservableTransformer { observable ->
observable.subscribeOn(Schedulers.io())
......@@ -107,6 +109,7 @@ object RxUtils {
* RxJava 线程协调 / RxLifecycle绑定方法
*
*/
@JvmStatic
fun <T> applySchedulers(view: IView): ObservableTransformer<T, T> {
return ObservableTransformer { observable ->
observable.subscribeOn(Schedulers.io())
......@@ -116,9 +119,23 @@ object RxUtils {
}
}
@JvmStatic
fun <T> applySchedulers(iLifecycleable: ILifecycleable<*> ?= null): ObservableTransformer<T, T> {
if (iLifecycleable == null){
return applySchedulers()
}
return ObservableTransformer { observable ->
observable.subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxLifecycleUtils.bindToLifecycle(iLifecycleable))
}
}
/**
* RxJava 线程协调方法
*/
@JvmStatic
fun <T> applySchedulers(): ObservableTransformer<T, T> {
return ObservableTransformer { observable ->
observable.subscribeOn(Schedulers.io())
......
......@@ -83,7 +83,7 @@ class RxLifecycleUtils private constructor() {
/**
* 绑定 Activity/Fragment 的生命周期
*
* @param view
* @param activity
* @param <T>
* @return
</T> */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment