Я использую AWS AppSync Android SDK в своем проекте, и я заметил проблему, заключающуюся в том, что когда я запускаю мутацию, она работает нормально, если устройство подключено к сети, но если я выполняю автономную мутацию, а затем включаю свою сеть, одна и та же мутация обновляется на сервере несколько раз. Так что у меня много повторяющихся записей в моей БД.
Пробовал разные сценарии, но автономные обновления вызываются дважды или трижды после установления сетевого подключения.
//Класс конфигурации AppSyncClient
класс ClientFactory {
companion object {
@Volatile
private var mAWSAppSyncClient: AWSAppSyncClient? = null
private var cacheKeyResolver: CacheKeyResolver? = null
private var appSyncSqlHelper: AppSyncSqlHelper?=null
private var mNormalizedCacheFactory: SqlNormalizedCacheFactory?=null
var client:OkHttpClient?=null
private lateinit var interceptor: HttpLoggingInterceptor
@Synchronized
fun getInstance(context: Context,utoken:String, dbName:String): AWSAppSyncClient? {
if (cacheKeyResolver == null){
cacheKeyResolver = object : CacheKeyResolver() {
override fun fromFieldRecordSet(field: ResponseField, recordSet: Map<String, Any>): CacheKey {
val typeName = recordSet["__typename"] as String
if ("MessagesResponse" == typeName) {
val userKey = typeName + "." + recordSet["login"]
return CacheKey.from(userKey)
}
if (recordSet.containsKey("id")) {
val typeNameAndIDKey = recordSet["__typename"].toString() + "." + recordSet["id"]
return CacheKey.from(typeNameAndIDKey)
}
return CacheKey.NO_KEY
}
override fun fromFieldArguments(field: ResponseField, variables: Operation.Variables): CacheKey {
return CacheKey.NO_KEY
}
}
}
interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
appSyncSqlHelper = AppSyncSqlHelper.create(context, dbName)
mNormalizedCacheFactory = SqlNormalizedCacheFactory(appSyncSqlHelper)
if(client==null) {
val cacheSize = 10 * 1024 * 1024 // 10MB
client =
OkHttpClient.Builder().cache(Cache(context.cacheDir, cacheSize.toLong())).addInterceptor(interceptor)
.addNetworkInterceptor { chain ->
val newRequest = chain.request().newBuilder()
.addHeader("Authorization", "Bearer ".plus(utoken))
.build()
chain.proceed(newRequest)
}.build()
}
val awsConfig = AWSConfiguration(context)
mAWSAppSyncClient = AWSAppSyncClient.builder()
.context(context)
.okHttpClient(client)
.normalizedCache(mNormalizedCacheFactory)
.resolver(cacheKeyResolver)
.persistentMutationsCallback(object : PersistentMutationsCallback {
override fun onFailure(error: PersistentMutationsError?)
{
Log.v("dd","ff")
}
override fun onResponse(response: PersistentMutationsResponse?)
{
Log.v("dd","ff")
}
})
.awsConfiguration(awsConfig)
.build()
return mAWSAppSyncClient
}
}
}
// Реализация мутации
val graphqlCallback = object : GraphQLCall.Callback<MessageActivityMutation.Data>() {
override fun onResponse(response: Response<MessageActivityMutation.Data>) {
if(response!=null){}
}
override fun onFailure(e: ApolloException) {
e.printStackTrace()
}
}
ClientFactory.getInstance(thiscontext!!,preferencesHelper!!.userAuthToken,"messageackmutation_db")
?.mutate(MessageActivityMutation.builder()
.id(msg_id)
.verb(Constants.MESSAGE_ACKNOWLEDGED)
.actioned_at(timeStamp)
.build())
?.enqueue(graphqlCallback)
ДЕТАЛИ ЛОГКАТА***
******ПОСЛЕ ВКЛЮЧЕНИЯ СЕТИ*******
Я думаю, что нашел ответ, но не совсем уверен, почему это происходит. Дело в том, что помимо переопределения
companion object {
@Volatile
private var mAWSAppSyncClient: AWSAppSyncClient? = null
private var cacheKeyResolver: CacheKeyResolver? = null
private var appSyncSqlHelper: AppSyncSqlHelper?=null
private var mNormalizedCacheFactory: SqlNormalizedCacheFactory?=null
var client:OkHttpClient?=null
private lateinit var interceptor: HttpLoggingInterceptor
@Synchronized
fun getInstance(context: Context,utoken:String, dbName:String): AWSAppSyncClient? {
if (cacheKeyResolver == null){
cacheKeyResolver = object : CacheKeyResolver() {
override fun fromFieldRecordSet(field: ResponseField, recordSet: Map<String, Any>): CacheKey {
val typeName = recordSet["__typename"] as String
if ("MessagesResponse" == typeName) {
val userKey = typeName + "." + recordSet["login"]
return CacheKey.from(userKey)
}
if (recordSet.containsKey("id")) {
val typeNameAndIDKey = recordSet["__typename"].toString() + "." + recordSet["id"]
return CacheKey.from(typeNameAndIDKey)
}
return CacheKey.NO_KEY
}
override fun fromFieldArguments(field: ResponseField, variables: Operation.Variables): CacheKey {
return CacheKey.NO_KEY
}
}
}
interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
appSyncSqlHelper = AppSyncSqlHelper.create(context, dbName)
mNormalizedCacheFactory = SqlNormalizedCacheFactory(appSyncSqlHelper)
if(client==null) {
val cacheSize = 10 * 1024 * 1024 // 10MB
client =
OkHttpClient.Builder().cache(Cache(context.cacheDir, cacheSize.toLong())).addInterceptor(interceptor)
.addNetworkInterceptor { chain ->
val newRequest = chain.request().newBuilder()
.addHeader("Authorization", "Bearer ".plus(utoken))
.build()
chain.proceed(newRequest)
}.build()
}
val awsConfig = AWSConfiguration(context)
mAWSAppSyncClient = AWSAppSyncClient.builder()
.context(context)
.okHttpClient(client)
.normalizedCache(mNormalizedCacheFactory)
.resolver(cacheKeyResolver)
.persistentMutationsCallback(object : PersistentMutationsCallback {
override fun onFailure(error: PersistentMutationsError?)
{
Log.v("dd","ff")
}
override fun onResponse(response: PersistentMutationsResponse?)
{
Log.v("dd","ff")
}
})
.awsConfiguration(awsConfig)
.build()
return mAWSAppSyncClient
}
}
и val graphqlCallback = object : GraphQLCall.Callback<MessageActivityMutation.Data>() {
override fun onResponse(response: Response<MessageActivityMutation.Data>) {
if(response!=null){}
}
override fun onFailure(e: ApolloException) {
e.printStackTrace()
}
}
ClientFactory.getInstance(thiscontext!!,preferencesHelper!!.userAuthToken,"messageackmutation_db")
?.mutate(MessageActivityMutation.builder()
.id(msg_id)
.verb(Constants.MESSAGE_ACKNOWLEDGED)
.actioned_at(timeStamp)
.build())
?.enqueue(graphqlCallback)
в вашей мутации вам нужно переопределить другой метод, то есть _3_, и очистить очередь мутаций. Я считаю, что он вызывается дважды или трижды, иногда один раз для планирования и один раз для сети.
Надеюсь, поможет.