Skip to content

Commit 270e035

Browse files
committed
加入 Kotlin 协程
优化部分代码的写法
1 parent 74541ff commit 270e035

File tree

12 files changed

+56
-78
lines changed

12 files changed

+56
-78
lines changed

README.md

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66

77
* 博客地址:[但愿人长久,搬砖不再有](https://www.jianshu.com/p/77dd326f21dc)
88

9+
* 另外你如果对 Kotlin 不熟悉,恰好想学习的话,推荐你通过下面这三篇文章来学习
10+
11+
* [全民 Kotlin:Java我们不一样](https://www.jianshu.com/p/a01e6b957269)
12+
13+
* [全民 Kotlin:你没有玩过的全新玩法](https://www.jianshu.com/p/884ca0a49e5e)
14+
15+
* [全民 Kotlin:协程特别篇](https://www.jianshu.com/p/2e0746c7d4f3)
16+
917
* 当我们日复一日年复一年的搬砖的时候,你是否曾想过提升一下开发效率,如果一个通用的架构摆在你的面前,你还会选择自己搭架构么,但是搭建出一个好的架构并非易事,有多少人愿意选择去做,还有多少人选择努力去做好,可能寥寥无几,但是你今天看到的,正是你所想要的,一个真正能解决你开发新项目时最大痛点的架构工程,你不需要再麻木 Copy 原有旧项目的代码,只需改动少量代码就能得到想要的效果,你会发现开发新项目其实是一件很快乐的事。
1018

1119
* AndroidProject 已维护三年多的时间,几乎耗尽我所有的业余时间,里面的代码改了再改,改了又改,不断 Review、不断创新、不断改进、不断测试、不断优化,每天都在重复这些枯燥的步骤,但是只有这样才能把这件事做好,因为我相信把同样一件事重复做,迟早有一天可以做好。

app/src/main/java/com/hjq/demo/manager/ActivityManager.kt

+2-10
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,10 @@ class ActivityManager private constructor() : ActivityLifecycleCallbacks {
1919
companion object {
2020

2121
@Suppress("StaticFieldLeak")
22-
@Volatile
23-
private var sInstance: ActivityManager? = null
22+
private val activityManager: ActivityManager by lazy { ActivityManager() }
2423

2524
fun getInstance(): ActivityManager {
26-
if (sInstance == null) {
27-
synchronized(ActivityManager::class.java) {
28-
if (sInstance == null) {
29-
sInstance = ActivityManager()
30-
}
31-
}
32-
}
33-
return sInstance!!
25+
return activityManager
3426
}
3527

3628
/**

app/src/main/java/com/hjq/demo/manager/ThreadPoolManager.kt

-34
This file was deleted.

app/src/main/java/com/hjq/demo/ui/activity/CrashActivity.kt

+8-3
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@ import android.view.View
1818
import android.widget.TextView
1919
import androidx.core.view.GravityCompat
2020
import androidx.drawerlayout.widget.DrawerLayout
21+
import androidx.lifecycle.lifecycleScope
2122
import com.gyf.immersionbar.ImmersionBar
2223
import com.hjq.demo.R
2324
import com.hjq.demo.aop.SingleClick
2425
import com.hjq.demo.app.AppActivity
25-
import com.hjq.demo.manager.ThreadPoolManager
2626
import com.hjq.demo.other.AppConfig
2727
import com.hjq.permissions.Permission
2828
import com.hjq.permissions.XXPermissions
2929
import com.tencent.bugly.crashreport.CrashReport
30+
import kotlinx.coroutines.Dispatchers
31+
import kotlinx.coroutines.launch
3032
import java.io.PrintWriter
3133
import java.io.StringWriter
3234
import java.net.InetAddress
@@ -227,14 +229,17 @@ class CrashActivity : AppActivity() {
227229
}
228230
if (permissions.contains(Manifest.permission.INTERNET)) {
229231
builder.append("\n当前网络访问:\t")
230-
ThreadPoolManager.getInstance().execute {
232+
233+
lifecycleScope.launch(Dispatchers.IO) {
231234
try {
232235
InetAddress.getByName("www.baidu.com")
233236
builder.append("正常")
234237
} catch (ignored: UnknownHostException) {
235238
builder.append("异常")
236239
}
237-
post { infoView?.text = builder }
240+
lifecycleScope.launch(Dispatchers.Main) {
241+
infoView?.text = builder
242+
}
238243
}
239244
} else {
240245
infoView?.text = builder

app/src/main/java/com/hjq/demo/ui/activity/ImageSelectActivity.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import android.provider.MediaStore
88
import android.text.TextUtils
99
import android.view.*
1010
import android.view.animation.*
11+
import androidx.lifecycle.lifecycleScope
1112
import androidx.recyclerview.widget.RecyclerView
1213
import com.hjq.base.BaseActivity
1314
import com.hjq.base.BaseAdapter
@@ -18,7 +19,6 @@ import com.hjq.demo.aop.Log
1819
import com.hjq.demo.aop.Permissions
1920
import com.hjq.demo.aop.SingleClick
2021
import com.hjq.demo.app.AppActivity
21-
import com.hjq.demo.manager.ThreadPoolManager
2222
import com.hjq.demo.other.GridSpaceDecoration
2323
import com.hjq.demo.ui.activity.CameraActivity.OnCameraListener
2424
import com.hjq.demo.ui.adapter.ImageSelectAdapter
@@ -28,6 +28,8 @@ import com.hjq.demo.widget.StatusLayout
2828
import com.hjq.permissions.Permission
2929
import com.hjq.permissions.XXPermissions
3030
import com.hjq.widget.view.FloatActionButton
31+
import kotlinx.coroutines.Dispatchers
32+
import kotlinx.coroutines.launch
3133
import java.io.File
3234
import java.util.*
3335

@@ -150,7 +152,7 @@ class ImageSelectActivity : AppActivity(), StatusAction, Runnable,
150152
// 显示加载进度条
151153
showLoading()
152154
// 加载图片列表
153-
ThreadPoolManager.getInstance().execute(this)
155+
lifecycleScope.launch(Dispatchers.IO) { run() }
154156
}
155157

156158
override fun getStatusLayout(): StatusLayout? {
@@ -238,7 +240,7 @@ class ImageSelectActivity : AppActivity(), StatusAction, Runnable,
238240
// 这里需要延迟刷新,否则可能会找不到拍照的图片
239241
postDelayed({
240242
// 重新加载图片列表
241-
ThreadPoolManager.getInstance().execute(this@ImageSelectActivity)
243+
lifecycleScope.launch { run() }
242244
}, 1000)
243245
}
244246

app/src/main/java/com/hjq/demo/ui/activity/SettingActivity.kt

+7-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.hjq.demo.ui.activity
22

33
import android.view.Gravity
44
import android.view.View
5+
import androidx.lifecycle.lifecycleScope
56
import com.hjq.base.BaseDialog
67
import com.hjq.base.action.AnimAction
78
import com.hjq.demo.R
@@ -12,7 +13,6 @@ import com.hjq.demo.http.glide.GlideApp
1213
import com.hjq.demo.http.model.HttpData
1314
import com.hjq.demo.manager.ActivityManager
1415
import com.hjq.demo.manager.CacheDataManager
15-
import com.hjq.demo.manager.ThreadPoolManager
1616
import com.hjq.demo.other.AppConfig
1717
import com.hjq.demo.ui.dialog.MenuDialog
1818
import com.hjq.demo.ui.dialog.SafeDialog
@@ -21,6 +21,9 @@ import com.hjq.http.EasyHttp
2121
import com.hjq.http.listener.HttpCallback
2222
import com.hjq.widget.layout.SettingBar
2323
import com.hjq.widget.view.SwitchButton
24+
import kotlinx.coroutines.Dispatchers
25+
import kotlinx.coroutines.launch
26+
import kotlinx.coroutines.withContext
2427

2528
/**
2629
* author : Android 轮子哥
@@ -132,11 +135,11 @@ class SettingActivity : AppActivity(), SwitchButton.OnCheckedChangeListener {
132135

133136
// 清除内存缓存(必须在主线程)
134137
GlideApp.get(this@SettingActivity).clearMemory()
135-
ThreadPoolManager.getInstance().execute {
136-
CacheDataManager.clearAllCache(this)
138+
lifecycleScope.launch(Dispatchers.IO) {
139+
CacheDataManager.clearAllCache(this@SettingActivity)
137140
// 清除本地缓存(必须在子线程)
138141
GlideApp.get(this@SettingActivity).clearDiskCache()
139-
post {
142+
withContext(Dispatchers.Main) {
140143
// 重新获取应用缓存大小
141144
cleanCacheView?.setRightText(CacheDataManager.getTotalCacheSize(this@SettingActivity))
142145
}

app/src/main/java/com/hjq/demo/ui/activity/VideoSelectActivity.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.os.Parcelable
1111
import android.provider.MediaStore
1212
import android.view.*
1313
import android.view.animation.*
14+
import androidx.lifecycle.lifecycleScope
1415
import androidx.recyclerview.widget.RecyclerView
1516
import com.hjq.base.BaseActivity
1617
import com.hjq.base.BaseAdapter
@@ -21,7 +22,6 @@ import com.hjq.demo.aop.Log
2122
import com.hjq.demo.aop.Permissions
2223
import com.hjq.demo.aop.SingleClick
2324
import com.hjq.demo.app.AppActivity
24-
import com.hjq.demo.manager.ThreadPoolManager
2525
import com.hjq.demo.other.GridSpaceDecoration
2626
import com.hjq.demo.ui.activity.CameraActivity.OnCameraListener
2727
import com.hjq.demo.ui.adapter.VideoSelectAdapter
@@ -32,6 +32,8 @@ import com.hjq.permissions.Permission
3232
import com.hjq.permissions.XXPermissions
3333
import com.hjq.widget.view.FloatActionButton
3434
import com.tencent.bugly.crashreport.CrashReport
35+
import kotlinx.coroutines.Dispatchers
36+
import kotlinx.coroutines.launch
3537
import java.io.File
3638
import java.util.*
3739

@@ -150,7 +152,7 @@ class VideoSelectActivity : AppActivity(), StatusAction, Runnable, BaseAdapter.O
150152
// 显示加载进度条
151153
showLoading()
152154
// 加载视频列表
153-
ThreadPoolManager.getInstance().execute(this)
155+
lifecycleScope.launch(Dispatchers.IO) { run() }
154156
}
155157

156158
override fun getStatusLayout(): StatusLayout? {
@@ -241,7 +243,7 @@ class VideoSelectActivity : AppActivity(), StatusAction, Runnable, BaseAdapter.O
241243
// 这里需要延迟刷新,否则可能会找不到拍照的视频
242244
postDelayed({
243245
// 重新加载视频列表
244-
ThreadPoolManager.getInstance().execute(this@VideoSelectActivity)
246+
lifecycleScope.launch { run() }
245247
}, 1000)
246248
}
247249

app/src/main/java/com/hjq/demo/ui/fragment/HomeFragment.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package com.hjq.demo.ui.fragment
22

33
import android.content.res.ColorStateList
44
import android.widget.TextView
5-
import androidx.appcompat.widget.*
5+
import androidx.appcompat.widget.AppCompatImageView
6+
import androidx.appcompat.widget.Toolbar
67
import androidx.core.content.ContextCompat
78
import androidx.recyclerview.widget.RecyclerView
89
import androidx.viewpager.widget.ViewPager
@@ -13,7 +14,7 @@ import com.hjq.demo.R
1314
import com.hjq.demo.app.AppFragment
1415
import com.hjq.demo.app.TitleBarFragment
1516
import com.hjq.demo.ui.activity.HomeActivity
16-
import com.hjq.demo.ui.adapter.*
17+
import com.hjq.demo.ui.adapter.TabAdapter
1718
import com.hjq.demo.ui.adapter.TabAdapter.OnTabListener
1819
import com.hjq.demo.widget.XCollapsingToolbarLayout
1920
import com.hjq.demo.widget.XCollapsingToolbarLayout.OnScrimsListener

common.gradle

+6
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,10 @@ dependencies {
6868
implementation 'androidx.appcompat:appcompat:1.3.1'
6969
// Material 库:https://github.com/material-components/material-components-android
7070
implementation 'com.google.android.material:material:1.4.0'
71+
72+
// Kotlin 协程:https://github.com/Kotlin/kotlinx.coroutines
73+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'
74+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
75+
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
76+
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
7177
}

library/base/src/main/java/com/hjq/base/action/HandlerAction.kt

+1-5
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,7 @@ interface HandlerAction {
3434
* 延迟一段时间执行
3535
*/
3636
fun postDelayed(runnable: Runnable, delayMillis: Long): Boolean {
37-
var delayMillis: Long = delayMillis
38-
if (delayMillis < 0) {
39-
delayMillis = 0
40-
}
41-
return postAtTime(runnable, SystemClock.uptimeMillis() + delayMillis)
37+
return postAtTime(runnable, SystemClock.uptimeMillis() + if (delayMillis < 0) 0 else delayMillis)
4238
}
4339

4440
/**

library/widget/src/main/java/com/hjq/widget/view/ClearEditText.kt

+3-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.hjq.widget.view
33
import android.content.Context
44
import android.graphics.drawable.Drawable
55
import android.text.Editable
6+
import android.text.TextUtils
67
import android.text.TextWatcher
78
import android.util.AttributeSet
89
import android.view.MotionEvent
@@ -60,11 +61,7 @@ class ClearEditText @JvmOverloads constructor(
6061
* [OnFocusChangeListener]
6162
*/
6263
override fun onFocusChange(view: View, hasFocus: Boolean) {
63-
if (hasFocus && text != null) {
64-
setDrawableVisible(text!!.isNotEmpty())
65-
} else {
66-
setDrawableVisible(false)
67-
}
64+
setDrawableVisible(hasFocus && !TextUtils.isEmpty(text))
6865
focusChangeListener?.onFocusChange(view, hasFocus)
6966
}
7067

@@ -91,7 +88,7 @@ class ClearEditText @JvmOverloads constructor(
9188
}
9289
return true
9390
}
94-
return touchListener != null && touchListener!!.onTouch(view, event)
91+
return touchListener?.onTouch(view, event) ?: false
9592
}
9693

9794
/**

library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.hjq.widget.view
22

3-
import android.content.*
3+
import android.content.Context
44
import android.graphics.drawable.Drawable
5-
import android.text.*
5+
import android.text.Editable
6+
import android.text.InputType
7+
import android.text.TextUtils
8+
import android.text.TextWatcher
69
import android.text.method.HideReturnsTransformationMethod
710
import android.text.method.PasswordTransformationMethod
811
import android.util.AttributeSet
9-
import android.view.*
12+
import android.view.MotionEvent
13+
import android.view.View
1014
import android.view.View.OnFocusChangeListener
1115
import android.view.View.OnTouchListener
1216
import androidx.core.content.ContextCompat
@@ -76,11 +80,7 @@ class PasswordEditText @JvmOverloads constructor(
7680
* [OnFocusChangeListener]
7781
*/
7882
override fun onFocusChange(view: View?, hasFocus: Boolean) {
79-
if (hasFocus && text != null) {
80-
setDrawableVisible(text!!.isNotEmpty())
81-
} else {
82-
setDrawableVisible(false)
83-
}
83+
setDrawableVisible(hasFocus && !TextUtils.isEmpty(text))
8484
focusChangeListener?.onFocusChange(view, hasFocus)
8585
}
8686

0 commit comments

Comments
 (0)