Skip to content

Commit

Permalink
解决dialogfragment使用单例导致的内存泄露问题
Browse files Browse the repository at this point in the history
  • Loading branch information
K0170016 authored and K0170016 committed Jun 20, 2019
1 parent f0e21e5 commit 0bc6f27
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 63 deletions.
8 changes: 8 additions & 0 deletions core-common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//Kotlin Java1.8支持
kotlinOptions {
jvmTarget = "1.8"
}
//Kotlin 实验功能
androidExtensions {
experimental = true
}
}
dependencies {
//Dagger编译时生成
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.huyingbao.core.common.dialog

import android.content.DialogInterface
import android.os.Bundle
import android.os.Parcel
import android.os.Parcelable
import android.text.TextUtils
import android.view.View
import android.widget.TextView
Expand All @@ -10,20 +12,24 @@ import com.huyingbao.core.common.R
import com.huyingbao.core.common.module.CommonContants
import kotlinx.android.synthetic.main.common_dialog_info.*
import org.jetbrains.anko.toast
import javax.inject.Inject
import javax.inject.Singleton

/**
* 内容提交编辑框
*
* Created by liujunfeng on 2019/6/13.
*/
class CommonInfoDialog @Inject constructor() : BaseCommonDialog() {
var info: Info? = null
class CommonInfoDialog : BaseCommonDialog() {
var clickListener: CommonInfoDialogClickListener? = null

private var commonInfo: CommonInfo? = null

companion object {
fun newInstance(): CommonInfoDialog {
return CommonInfoDialog()
fun newInstance(info: CommonInfo): CommonInfoDialog {
return CommonInfoDialog().apply {
arguments = Bundle().apply {
putParcelable(CommonContants.Key.INFO, info)
}
}
}
}

Expand All @@ -32,32 +38,39 @@ class CommonInfoDialog @Inject constructor() : BaseCommonDialog() {
}

override fun afterCreate(savedInstanceState: Bundle?) {

arguments?.let {
if (it.containsKey(CommonContants.Key.INFO)) {
commonInfo = it.getParcelable(CommonContants.Key.INFO)
}
}
}

override fun onResume() {
super.onResume()
if (info == null) {
if (commonInfo == null) {
context?.toast("请设置初始参数!")
dismiss()
} else {
setTextView(info!!.title, tv_info_title)
setTextView(info!!.content, tv_info_content)
setTextView(info!!.editTitle, et_info_title)
setTextView(info!!.editContent, et_info_content)
setTextView(commonInfo!!.title, tv_info_title)
setTextView(commonInfo!!.content, tv_info_content)
setTextView(commonInfo!!.editTitle, et_info_title)
setTextView(commonInfo!!.editContent, et_info_content)
tv_info_cancel.setOnClickListener { onCancelClicked() }
tv_info_ok.setOnClickListener { onOkClicked() }
}
}

override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
info = null
commonInfo = null
clickListener = null

}

override fun onCancel(dialog: DialogInterface) {
super.onCancel(dialog)
info = null
commonInfo = null
clickListener = null
}

/**
Expand All @@ -79,9 +92,11 @@ class CommonInfoDialog @Inject constructor() : BaseCommonDialog() {
* 取消
*/
private fun onCancelClicked() {
if (info != null && !TextUtils.isEmpty(info!!.actionSecond)) {
// TODO
// info!!.actionSecond?.let { mCommonActionCreator.postLocalAction(it) }
if (commonInfo != null && !TextUtils.isEmpty(commonInfo!!.actionSecond)) {
commonInfo!!.actionSecond.let {
//TODO 如果设置Action,则发送Action
//mCommonActionCreator.postLocalAction(it)
}
}
dismiss()
}
Expand All @@ -90,43 +105,79 @@ class CommonInfoDialog @Inject constructor() : BaseCommonDialog() {
* 确定,输入框中的内容可以为空
*/
private fun onOkClicked() {
if (info == null) {
if (commonInfo == null) {
dismiss()
}
val title = et_info_title!!.text.toString()
val content = et_info_content!!.text.toString()
if (info!!.infoDialogClickListener != null) {
//如果有点击监听,则回调方法
info!!.infoDialogClickListener!!.onConfirm(title, content)
}
if (!TextUtils.isEmpty(info!!.actionFirst)) {
clickListener?.onConfirm(title, content)
if (!TextUtils.isEmpty(commonInfo!!.actionFirst)) {
//TODO 如果设置Action,则发送Action
// info!!.actionFirst?.let {
// mCommonActionCreator.postLocalAction(it,
// CommonContants.Key.TITLE, title,
// CommonContants.Key.CONTENT, content)
// }
commonInfo!!.actionFirst.let {
//mCommonActionCreator.postLocalAction(it, CommonContants.Key.TITLE, title, CommonContants.Key.CONTENT, content)
}
}
dismiss()
}
}

/**
* 点击回调接口
*/
interface CommonInfoDialogClickListener {
/**
* 点击回调接口
* 点击确认
*/
interface InfoDialogClickListener {
/**
* 点击确认
*/
fun onConfirm(editTitle: String, editContent: String)
fun onConfirm(editTitle: String, editContent: String)
}

/**
* Dialog初始化信息封装
*/
class CommonInfo : Parcelable {
var title: String? = null
var content: String? = null
var editTitle: String? = null
var editContent: String? = null
var actionFirst: String? = null
var actionSecond: String? = null

override fun describeContents(): Int {
return 0
}

override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeString(this.title)
dest.writeString(this.content)
dest.writeString(this.editTitle)
dest.writeString(this.editContent)
dest.writeString(this.actionFirst)
dest.writeString(this.actionSecond)
}

constructor() {}

protected constructor(`in`: Parcel) {
this.title = `in`.readString()
this.content = `in`.readString()
this.editTitle = `in`.readString()
this.editContent = `in`.readString()
this.actionFirst = `in`.readString()
this.actionSecond = `in`.readString()
}

class Info {
var title: CharSequence? = null
var content: CharSequence? = null
var editTitle: CharSequence? = null
var editContent: CharSequence? = null
var actionFirst: String? = null
var actionSecond: String? = null
var infoDialogClickListener: InfoDialogClickListener? = null
companion object {

@JvmField
val CREATOR: Parcelable.Creator<CommonInfo> = object : Parcelable.Creator<CommonInfo> {
override fun createFromParcel(source: Parcel): CommonInfo {
return CommonInfo(source)
}

override fun newArray(size: Int): Array<CommonInfo?> {
return arrayOfNulls(size)
}
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,17 @@ import android.content.DialogInterface
import android.os.Bundle
import android.text.TextUtils
import androidx.annotation.StringRes
import com.huyingbao.core.arch.action.RxActionManager
import com.huyingbao.core.base.dialog.BaseCommonDialog
import com.huyingbao.core.common.R
import kotlinx.android.synthetic.main.common_dialog_loading.*
import org.jetbrains.anko.toast
import javax.inject.Inject
import javax.inject.Singleton

/**
* 进度提示
*
* Created by liujunfeng on 2019/1/1.
*/
class CommonLoadingDialog @Inject constructor() : BaseCommonDialog() {
class CommonLoadingDialog : BaseCommonDialog() {
@StringRes
private var mMessageInt: Int = 0

Expand Down Expand Up @@ -57,8 +54,9 @@ class CommonLoadingDialog @Inject constructor() : BaseCommonDialog() {
* 取消订阅的Action
*/
private fun cancel() {
//TODO mRxActionManagerLazy.clear()
context?.toast("取消操作!")
//TODO 需要取消Action
//mRxActionManagerLazy.clear()
context?.toast("消失,未取消操作!")
dismiss()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class CommonContants {
const val PASSWORD = "password"
const val TITLE = "title"
const val CONTENT = "content"
const val INFO = "info"
}

object Header {
Expand Down
4 changes: 4 additions & 0 deletions depend_kotlin.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ android {
kotlinOptions {
jvmTarget = "1.8"
}
//Kotlin 实验功能
androidExtensions {
experimental = true
}
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ import androidx.fragment.app.FragmentPagerAdapter
import androidx.lifecycle.Observer
import androidx.viewpager.widget.ViewPager
import com.huyingbao.core.base.activity.BaseRxActivity
import com.huyingbao.core.common.dialog.CommonInfo
import com.huyingbao.core.common.dialog.CommonInfoDialog
import com.huyingbao.core.common.dialog.CommonInfoDialogClickListener
import com.huyingbao.core.common.module.CommonContants
import com.huyingbao.core.utils.LocalStorageUtils
import com.huyingbao.module.github.R
Expand All @@ -34,8 +36,6 @@ class MainActivity : BaseRxActivity<MainStore>() {
@Inject
lateinit var githubAppStore: GithubAppStore
@Inject
lateinit var commonInfoDialog: CommonInfoDialog
@Inject
lateinit var mainActionCreator: MainActionCreator
@Inject
lateinit var localStorageUtils: LocalStorageUtils
Expand Down Expand Up @@ -170,15 +170,16 @@ class MainActivity : BaseRxActivity<MainStore>() {
* 显示更新内容弹框
*/
private fun showFeedBackDialog() {
commonInfoDialog.info = CommonInfoDialog.Info()
commonInfoDialog.info!!.title = getString(R.string.github_menu_feedback)
commonInfoDialog.info!!.editContent = ""
commonInfoDialog.info!!.infoDialogClickListener = object : CommonInfoDialog.InfoDialogClickListener {
val info = CommonInfo()
info.title = getString(R.string.github_menu_feedback)
info.editContent = ""
val newInstance = CommonInfoDialog.newInstance(info)
newInstance.clickListener = object : CommonInfoDialogClickListener {
override fun onConfirm(editTitle: String, editContent: String) {
mainActionCreator.feedback(editContent)
}
}
commonInfoDialog.show(supportFragmentManager, commonInfoDialog.javaClass.simpleName)
newInstance.show(supportFragmentManager, CommonInfoDialog::class.java.simpleName)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import android.os.Bundle
import android.view.View
import androidx.lifecycle.Observer
import com.huyingbao.core.arch.model.RxChange
import com.huyingbao.core.base.fragment.BaseRxBindFragment
import com.huyingbao.core.common.dialog.CommonInfo
import com.huyingbao.core.common.dialog.CommonInfoDialog
import com.huyingbao.core.common.widget.CommonInfoCardView
import com.huyingbao.module.github.R
import com.huyingbao.core.base.fragment.BaseRxBindFragment
import com.huyingbao.module.github.app.GithubAppStore
import com.huyingbao.module.github.databinding.GithubFragmentUserBinding
import com.huyingbao.module.github.ui.user.action.UserAction
Expand All @@ -27,8 +28,6 @@ class UserFragment : BaseRxBindFragment<UserStore, GithubFragmentUserBinding>()
lateinit var userActionCreator: UserActionCreator
@Inject
lateinit var githubAppStore: GithubAppStore
@Inject
lateinit var commonInfoDialog: CommonInfoDialog

companion object {
fun newInstance(): UserFragment {
Expand Down Expand Up @@ -65,11 +64,13 @@ class UserFragment : BaseRxBindFragment<UserStore, GithubFragmentUserBinding>()
*/
private fun showUpdateDialog(infoView: View, tag: String) {
if (infoView is CommonInfoCardView) {
commonInfoDialog.info = CommonInfoDialog.Info()
commonInfoDialog.info!!.title = "编辑${infoView.infoTitle}"
commonInfoDialog.info!!.actionFirst = tag
commonInfoDialog.info!!.editContent = infoView.infoContent ?: ""
activity?.supportFragmentManager?.let { fragmentManager -> commonInfoDialog.show(fragmentManager, commonInfoDialog.javaClass.simpleName) }
activity?.supportFragmentManager?.let {
val info = CommonInfo()
info.title = "编辑${infoView.infoTitle}"
info.actionFirst = tag
info.editContent = (infoView.infoContent ?: "") as String?
CommonInfoDialog.newInstance(info).show(it, CommonInfoDialog::class.java.simpleName)
}
}
}

Expand Down

0 comments on commit 0bc6f27

Please sign in to comment.