Skip to content

Commit 98d17d2

Browse files
committed
1.增加了腾讯 Bugly;
2.LeakCanary 检测内存泄漏工具; 3.打开 APP 时增加统一权限处理。
1 parent 8aad113 commit 98d17d2

29 files changed

+319
-128
lines changed

app/build.gradle

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ android {
2929
}
3030
}
3131
signingConfig signingConfigs.config
32+
// 实现毛玻璃那种透明的效果需要添加的库
33+
renderscriptTargetApi 19
34+
renderscriptSupportModeEnabled true // Enable RS support
3235
}
3336
buildTypes {
3437
debug {
@@ -68,6 +71,7 @@ dependencies {
6871
implementation rootProject.ext.otherLibs
6972
// APT dependencies(Kotlin内置的注解处理器)
7073
kapt rootProject.ext.annotationProcessorLibs
74+
7175
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
7276
// 底部菜单
7377
implementation('com.flyco.tablayout:FlycoTabLayout_Lib:2.1.0@aar') {
@@ -91,4 +95,14 @@ dependencies {
9195
//Google开源的一个布局控件
9296
implementation 'com.google.android:flexbox:0.3.1'
9397
implementation project(':multiple-status-view')
98+
//模糊透明 View
99+
implementation 'com.github.mmin18:realtimeblurview:1.1.0'
100+
//leakCanary
101+
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
102+
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
103+
//腾讯 bugly
104+
compile 'com.tencent.bugly:crashreport:2.6.6.1'
105+
//运行时权限
106+
compile 'me.weyye.hipermission:library:1.0.7'
107+
94108
}

app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
1111
<!-- 访问网络 -->
1212
<uses-permission android:name="android.permission.INTERNET" />
13+
<!-- 读取手机状态 -->
14+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
15+
<uses-permission android:name="android.permission.READ_LOGS" />
16+
<!-- SD 卡读写权限 -->
17+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
18+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
1319

1420
<application
1521
android:name=".MyApplication"

app/src/main/java/com/hazz/kotlinmvp/Constants.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,8 @@ class Constants private constructor(){
2626

2727
val BUNDLE_VIDEO_DATA = "video_data"
2828
val BUNDLE_CATEGORY_DATA = "category_data"
29+
30+
//腾讯 Bugly APP id
31+
val BUGLY_APPID="176aad0d9e"
2932
}
3033
}

app/src/main/java/com/hazz/kotlinmvp/MyApplication.kt

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,14 @@ import android.util.Log
88
import com.hazz.kotlinmvp.utils.DisplayManager
99
import com.orhanobut.logger.AndroidLogAdapter
1010
import com.orhanobut.logger.Logger
11-
import kotlin.properties.Delegates
12-
import com.scwang.smartrefresh.layout.constant.SpinnerStyle
13-
import com.scwang.smartrefresh.layout.footer.ClassicsFooter
14-
import com.scwang.smartrefresh.layout.api.RefreshLayout
15-
import com.scwang.smartrefresh.layout.api.RefreshFooter
16-
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreater
17-
import com.scwang.smartrefresh.layout.SmartRefreshLayout
18-
import com.scwang.smartrefresh.layout.header.ClassicsHeader
19-
import com.scwang.smartrefresh.layout.api.RefreshHeader
20-
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreater
2111
import com.orhanobut.logger.PrettyFormatStrategy
22-
import com.orhanobut.logger.FormatStrategy
2312
import com.scwang.smartrefresh.header.MaterialHeader
13+
import com.scwang.smartrefresh.layout.SmartRefreshLayout
14+
import com.squareup.leakcanary.LeakCanary
15+
import com.squareup.leakcanary.RefWatcher
16+
import com.tencent.bugly.crashreport.CrashReport
17+
import kotlinx.android.synthetic.main.fragment_home.*
18+
import kotlin.properties.Delegates
2419

2520

2621
/**
@@ -29,7 +24,7 @@ import com.scwang.smartrefresh.header.MaterialHeader
2924

3025
class MyApplication : Application(){
3126

32-
27+
private var refWatcher: RefWatcher? = null
3328

3429
companion object {
3530

@@ -39,35 +34,31 @@ class MyApplication : Application(){
3934
var context: Context by Delegates.notNull()
4035
private set
4136

42-
43-
}
44-
init {
45-
//static 代码段可以防止内存泄露 (全局的下拉刷新,上拉加载样式)
46-
//设置全局的Header构建器
47-
SmartRefreshLayout.setDefaultRefreshHeaderCreater { context, layout ->
48-
layout?.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white) //全局设置主题颜色
49-
MaterialHeader(context)
37+
fun getRefWatcher(context: Context): RefWatcher? {
38+
val myApplication = context.applicationContext as MyApplication
39+
return myApplication.refWatcher
5040
}
51-
//设置全局的Footer构建器
52-
// SmartRefreshLayout.setDefaultRefreshFooterCreater { context, _ ->
53-
// //指定为经典Footer,默认是 BallPulseFooter
54-
// ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Scale)
55-
// }
56-
}
57-
5841

42+
}
5943

6044
override fun onCreate() {
6145
super.onCreate()
62-
6346
context = applicationContext
47+
refWatcher = setupLeakCanary()
6448
initConfig()
6549
DisplayManager.init(this)
6650
registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks)
6751

6852

6953
}
7054

55+
private fun setupLeakCanary(): RefWatcher {
56+
return if (LeakCanary.isInAnalyzerProcess(this)) {
57+
RefWatcher.DISABLED
58+
} else LeakCanary.install(this)
59+
}
60+
61+
7162
/**
7263
* 初始化配置
7364
*/
@@ -84,7 +75,8 @@ class MyApplication : Application(){
8475
return BuildConfig.DEBUG
8576
}
8677
})
87-
78+
//测试阶段建议设置成true,发布时设置为false。
79+
CrashReport.initCrashReport(applicationContext, Constants.BUGLY_APPID, false)
8880
}
8981

9082

app/src/main/java/com/hazz/kotlinmvp/api/api

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@
1010

1111
//热门搜索词
1212
http://baobab.kaiyanapp.com/api/v3/queries/hot
13-
["阅后即瞎","日食记","复仇者联盟","励志","谷阿莫","复仇者联盟3","美食","广告","爱情","舞蹈","搞笑","漫威","动画","日本","电影相关","健身","VR","滑板","脱口秀","寻梦环游记"]
13+
["阅后即瞎","日食记","复仇者联盟","励志","谷阿莫","复仇者联盟3","美食","广告","爱情","舞蹈","搞笑","漫威","动画","日本","电影相关","健身","VR","滑板","脱口秀","寻梦环游记"]
14+
15+
作者信息
16+
http://baobab.kaiyanapp.com/api/v4/pgcs/detail/tab?id=571

app/src/main/java/com/hazz/kotlinmvp/base/BaseActivity.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.view.View
77
import android.view.inputmethod.InputMethodManager
88
import android.widget.EditText
99
import com.classic.common.MultipleStatusView
10+
import com.hazz.kotlinmvp.MyApplication
1011
import com.hazz.kotlinmvp.showToast
1112

1213

@@ -27,9 +28,15 @@ abstract class BaseActivity : AppCompatActivity() {
2728
initData()
2829
initView()
2930
start()
30-
mLayoutStatusView?.setOnClickListener(mRetryClickListener)
31+
initListener()
32+
33+
34+
}
3135

36+
private fun initListener() {
37+
mLayoutStatusView?.setOnClickListener(mRetryClickListener)
3238
}
39+
3340
open val mRetryClickListener: View.OnClickListener = View.OnClickListener {
3441
start()
3542
}
@@ -74,6 +81,11 @@ abstract class BaseActivity : AppCompatActivity() {
7481
}
7582

7683

84+
override fun onDestroy() {
85+
super.onDestroy()
86+
MyApplication.getRefWatcher(this)?.watch(this)
87+
}
88+
7789
}
7890

7991

app/src/main/java/com/hazz/kotlinmvp/base/BaseFragment.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.view.LayoutInflater
77
import android.view.View
88
import android.view.ViewGroup
99
import com.classic.common.MultipleStatusView
10+
import com.hazz.kotlinmvp.MyApplication
1011
import com.hazz.kotlinmvp.showToast
1112

1213
/**
@@ -79,4 +80,9 @@ import com.hazz.kotlinmvp.showToast
7980
* 懒加载
8081
*/
8182
abstract fun lazyLoad()
83+
84+
override fun onDestroy() {
85+
super.onDestroy()
86+
MyApplication.getRefWatcher(activity)?.watch(activity)
87+
}
8288
}

app/src/main/java/com/hazz/kotlinmvp/mvp/presenter/VideoDetailPresenter.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.hazz.kotlinmvp.dataFormat
77
import com.hazz.kotlinmvp.mvp.contract.VideoDetailContract
88
import com.hazz.kotlinmvp.mvp.model.VideoDetailModel
99
import com.hazz.kotlinmvp.mvp.model.bean.HomeBean
10+
import com.hazz.kotlinmvp.net.exception.ExceptionHandle
1011
import com.hazz.kotlinmvp.showToast
1112
import com.hazz.kotlinmvp.utils.DisplayManager
1213
import com.hazz.kotlinmvp.utils.NetworkUtil
@@ -73,13 +74,18 @@ class VideoDetailPresenter : BasePresenter<VideoDetailContract.View>(), VideoDet
7374
* 请求相关的视频数据
7475
*/
7576
override fun requestRelatedVideo(id: Long) {
76-
77+
mRootView?.showLoading()
7778
val disposable = videoDetailModel.requestRelatedData(id)
7879
.subscribe({ issue ->
79-
mRootView?.setRecentRelatedVideo(issue.itemList)
80+
mRootView?.apply {
81+
dismissLoading()
82+
setRecentRelatedVideo(issue.itemList)
83+
}
8084
}, { t ->
81-
mRootView?.setErrorMsg(t.toString())
82-
85+
mRootView?.apply {
86+
dismissLoading()
87+
setErrorMsg(ExceptionHandle.handleException(t))
88+
}
8389
})
8490

8591
addSubscription(disposable)

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.hazz.kotlinmvp.ui.activity
22

3+
import android.annotation.SuppressLint
34
import android.content.Intent
45
import android.net.Uri
6+
import com.hazz.kotlinmvp.MyApplication
57
import com.hazz.kotlinmvp.R
68
import com.hazz.kotlinmvp.base.BaseActivity
9+
import com.hazz.kotlinmvp.utils.AppUtils
710
import com.hazz.kotlinmvp.utils.StatusBarUtil
811
import kotlinx.android.synthetic.main.activity_about.*
912

@@ -17,9 +20,12 @@ class AboutActivity : BaseActivity() {
1720
override fun initData() {
1821
}
1922

23+
@SuppressLint("SetTextI18n")
2024
override fun initView() {
2125
StatusBarUtil.darkMode(this)
2226
StatusBarUtil.setPaddingSmart(this, toolbar)
27+
28+
tv_version_name.text ="v${AppUtils.getVerName(MyApplication.context)}"
2329
//返回
2430
toolbar.setNavigationOnClickListener { finish() }
2531
//访问 GitHub

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

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@ class ProfileHomePageActivity : BaseActivity() {
5656
private val h = DensityUtil.dp2px(170f)
5757
private val color = ContextCompat.getColor(applicationContext, R.color.colorPrimary) and 0x00ffffff
5858
override fun onScrollChange(v: NestedScrollView, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
59-
var scrollY = scrollY
59+
var tScrollY= scrollY
6060
if (lastScrollY < h) {
61-
scrollY = Math.min(h, scrollY)
62-
mScrollY = if (scrollY > h) h else scrollY
61+
tScrollY = Math.min(h, tScrollY)
62+
mScrollY = if (tScrollY > h) h else tScrollY
6363
buttonBarLayout.alpha = 1f * mScrollY / h
6464
toolbar.setBackgroundColor(255 * mScrollY / h shl 24 or color)
6565
parallax.translationY = (mOffset - mScrollY).toFloat()
6666
}
67-
lastScrollY = scrollY
67+
lastScrollY = tScrollY
6868
}
6969
})
7070
buttonBarLayout.alpha = 0f
@@ -73,22 +73,22 @@ class ProfileHomePageActivity : BaseActivity() {
7373
toolbar.setNavigationOnClickListener { finish() }
7474

7575

76-
refreshLayout.setOnRefreshListener { mWebView.loadUrl("http://xuhaoblog.com") }
77-
refreshLayout.autoRefresh()
78-
79-
mWebView.settings.javaScriptEnabled = true
80-
mWebView.webViewClient = object : WebViewClient() {
81-
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
82-
view.loadUrl(url)
83-
return true
84-
}
85-
86-
override fun onPageFinished(view: WebView, url: String) {
87-
super.onPageFinished(view, url)
88-
refreshLayout.finishRefresh()
89-
view.loadUrl(String.format(Locale.CHINA, "javascript:document.body.style.paddingTop='%fpx'; void 0", DensityUtil.px2dp(mWebView.paddingTop.toFloat())))
90-
}
91-
}
76+
refreshLayout.setOnRefreshListener { }
77+
// refreshLayout.autoRefresh()
78+
79+
// mWebView.settings.javaScriptEnabled = true
80+
// mWebView.webViewClient = object : WebViewClient() {
81+
// override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
82+
// view.loadUrl(url)
83+
// return true
84+
// }
85+
//
86+
// override fun onPageFinished(view: WebView, url: String) {
87+
// super.onPageFinished(view, url)
88+
// refreshLayout.finishRefresh()
89+
// view.loadUrl(String.format(Locale.CHINA, "javascript:document.body.style.paddingTop='%fpx'; void 0", DensityUtil.px2dp(mWebView.paddingTop.toFloat())))
90+
// }
91+
// }
9292

9393
}
9494

0 commit comments

Comments
 (0)