diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 856204d..3cd3787 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,10 +40,7 @@ jobs: build: name: Build - strategy: - matrix: - os: [ ubuntu-latest, windows-latest, macos-latest ] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 0d15693..8c4e9b2 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -3,20 +3,12 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 5e8c53d..55c2d20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id("com.android.application") id("kotlin-android") + id("kotlin-parcelize") } android { diff --git a/app/src/main/java/com/kronos/sample/entity/TestEntity.kt b/app/src/main/java/com/kronos/sample/entity/TestEntity.kt index 0f6a769..549853f 100644 --- a/app/src/main/java/com/kronos/sample/entity/TestEntity.kt +++ b/app/src/main/java/com/kronos/sample/entity/TestEntity.kt @@ -1,16 +1,17 @@ package com.kronos.sample.entity -import android.os.Parcel import android.os.Parcelable - import com.kronos.diffutil.IDifference import com.kronos.diffutil.IEqualsAdapter - +import kotlinx.parcelize.Parcelize import java.util.Random -data class TestEntity(var id: Int = 0, - var displayTime: Long = 0, - var text: String? = Random().nextInt(10000).toString()) : Parcelable, IDifference, IEqualsAdapter { +@Parcelize +data class TestEntity( + var id: Int = 0, + var displayTime: Long = 0, + var text: String? = Random().nextInt(10000).toString() +) : Parcelable, IDifference, IEqualsAdapter { override val uniqueId: String get() = id.toString() @@ -19,27 +20,4 @@ data class TestEntity(var id: Int = 0, displayTime = System.currentTimeMillis() text = "更新数据" } - - - constructor(source: Parcel) : this( - source.readInt(), - source.readLong(), - source.readString() - ) - - override fun describeContents() = 0 - - override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) { - writeInt(id) - writeLong(displayTime) - writeString(text) - } - - companion object { - @JvmField - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): TestEntity = TestEntity(source) - override fun newArray(size: Int): Array = arrayOfNulls(size) - } - } } \ No newline at end of file diff --git a/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt b/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt index d861b06..4363865 100644 --- a/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt +++ b/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt @@ -8,24 +8,25 @@ import java.util.concurrent.CopyOnWriteArrayList class ParcelDiffHelper : BaseDiffHelper() { override fun clone() { - try { - itemsCursor?.apply { - snapshot = CopyOnWriteArrayList() - for (entity in this) { - val parcel = Parcel.obtain() - (entity as Parcelable).writeToParcel(parcel, 0) - parcel.setDataPosition(0) - val constructor = entity.javaClass.getDeclaredConstructor(Parcel::class.java) - constructor.isAccessible = true - val dateEntity = constructor.newInstance(parcel) as T - snapshot?.add(dateEntity) - parcel.recycle() - } + itemsCursor?.run { + snapshot = CopyOnWriteArrayList() + forEach { + snapshot?.add(it.deepCopy() ?: it) } - } catch (e: Exception) { - e.printStackTrace() } } + private fun T.deepCopy(): T? { + var parcel: Parcel? = null + return try { + parcel = Parcel.obtain().also { + it.writeParcelable(this, 0) + it.setDataPosition(0) + } + parcel.readParcelable(this::class.java.classLoader) + } finally { + parcel?.recycle() + } + } }