Skip to content

Commit f026963

Browse files
committed
fix
1 parent 88640bf commit f026963

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed

app/src/main/java/com/hazz/kotlinmvp/ui/activity/ProfileHomePageActivity.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.webkit.WebView
77
import android.webkit.WebViewClient
88
import com.hazz.kotlinmvp.R
99
import com.hazz.kotlinmvp.base.BaseActivity
10+
import com.hazz.kotlinmvp.utils.CleanLeakUtils
1011
import com.hazz.kotlinmvp.utils.StatusBarUtil
1112
import com.scwang.smartrefresh.layout.api.RefreshHeader
1213
import com.scwang.smartrefresh.layout.listener.SimpleMultiPurposeListener
@@ -94,4 +95,9 @@ class ProfileHomePageActivity : BaseActivity() {
9495
override fun start() {
9596

9697
}
98+
99+
override fun onDestroy() {
100+
CleanLeakUtils.fixInputMethodManagerLeak(this)
101+
super.onDestroy()
102+
}
97103
}

app/src/main/java/com/hazz/kotlinmvp/ui/activity/SearchActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.hazz.kotlinmvp.net.exception.ErrorStatus
2424
import com.hazz.kotlinmvp.showToast
2525
import com.hazz.kotlinmvp.ui.adapter.CategoryDetailAdapter
2626
import com.hazz.kotlinmvp.ui.adapter.HotKeywordsAdapter
27+
import com.hazz.kotlinmvp.utils.CleanLeakUtils
2728
import com.hazz.kotlinmvp.utils.StatusBarUtil
2829
import com.hazz.kotlinmvp.view.ViewAnimUtils
2930
import kotlinx.android.synthetic.main.activity_search.*
@@ -311,6 +312,7 @@ class SearchActivity : BaseActivity(), SearchContract.View {
311312
}
312313

313314
override fun onDestroy() {
315+
CleanLeakUtils.fixInputMethodManagerLeak(this)
314316
super.onDestroy()
315317
mPresenter.detachView()
316318
mTextTypeface = null

app/src/main/java/com/hazz/kotlinmvp/ui/activity/VideoDetailActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.hazz.kotlinmvp.mvp.model.bean.HomeBean
2121
import com.hazz.kotlinmvp.mvp.presenter.VideoDetailPresenter
2222
import com.hazz.kotlinmvp.showToast
2323
import com.hazz.kotlinmvp.ui.adapter.VideoDetailAdapter
24+
import com.hazz.kotlinmvp.utils.CleanLeakUtils
2425
import com.hazz.kotlinmvp.utils.StatusBarUtil
2526
import com.hazz.kotlinmvp.utils.WatchHistoryUtils
2627
import com.hazz.kotlinmvp.view.VideoListener
@@ -318,6 +319,7 @@ class VideoDetailActivity : BaseActivity(), VideoDetailContract.View {
318319
}
319320

320321
override fun onDestroy() {
322+
CleanLeakUtils.fixInputMethodManagerLeak(this)
321323
super.onDestroy()
322324
GSYVideoPlayer.releaseAllVideos()
323325
orientationUtils?.releaseListener()
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.hazz.kotlinmvp.utils
2+
3+
import android.content.Context
4+
import android.view.View
5+
import android.view.inputmethod.InputMethodManager
6+
import com.orhanobut.logger.Logger
7+
8+
import java.lang.reflect.Field
9+
10+
/**
11+
* Created by xuhao on 2017/12/13.
12+
* desc:
13+
*/
14+
15+
object CleanLeakUtils {
16+
17+
fun fixInputMethodManagerLeak(destContext: Context?) {
18+
if (destContext == null) {
19+
return
20+
}
21+
Logger.d("xiho,fix。。。。。。。。。。。。。。。。。")
22+
val inputMethodManager = destContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
23+
24+
val viewArray = arrayOf("mCurRootView", "mServedView", "mNextServedView")
25+
var filed: Field
26+
var filedObject: Any?
27+
28+
for (view in viewArray) {
29+
try {
30+
filed = inputMethodManager.javaClass.getDeclaredField(view)
31+
if (!filed.isAccessible) {
32+
filed.isAccessible = true
33+
}
34+
filedObject = filed.get(inputMethodManager)
35+
if (filedObject != null && filedObject is View) {
36+
val fileView = filedObject as View?
37+
if (fileView!!.context === destContext) { // 被InputMethodManager持有引用的context是想要目标销毁的
38+
filed.set(inputMethodManager, null) // 置空,破坏掉path to gc节点
39+
} else {
40+
break// 不是想要目标销毁的,即为又进了另一层界面了,不要处理,避免影响原逻辑,也就不用继续for循环了
41+
}
42+
}
43+
} catch (t: Throwable) {
44+
t.printStackTrace()
45+
}
46+
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)