Java 使用MVP对kotlin进行改造时的Api调用问题
我正在与kotlin一起使用MVP中的改装。API不会返回响应或完成视图加载 演示者代码Java 使用MVP对kotlin进行改造时的Api调用问题,java,android,kotlin,retrofit2,Java,Android,Kotlin,Retrofit2,我正在与kotlin一起使用MVP中的改装。API不会返回响应或完成视图加载 演示者代码 import android.content.Context import android.util.Log import com.crosspoles.CrosspolesApp import com.crosspoles.R import com.crosspoles.Views.LoginView import com.ruhe.model.LoginModel import okhttp3.Re
import android.content.Context
import android.util.Log
import com.crosspoles.CrosspolesApp
import com.crosspoles.R
import com.crosspoles.Views.LoginView
import com.ruhe.model.LoginModel
import okhttp3.RequestBody
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import java.util.*
class LoginPresenter : BasePresenter<LoginView?>() {
fun LoginUser(activity:Context, map:HashMap<String, RequestBody>, progress:Boolean) {
view!!.enableLoadingBar(activity, progress, activity.getResources().getString(R.string.loading))
CrosspolesApp.instance
?.apiService
?.login(map).enqueue(object:Callback<LoginModel> {
override fun onResponse(call:Call<LoginModel>, response:Response<LoginModel>) {
view!!.enableLoadingBar(activity, false, "")
view!!.onLoginComplete(response.body(), response.code())
Log.e("@@Start","dsadas")
}
override fun onFailure(call:Call<LoginModel>, t:Throwable) {
Log.e("@@Start2","dsadas")
view!!.enableLoadingBar(activity, false, "")
try {
t.printStackTrace()
}
catch (e:Exception) {
e.printStackTrace()
}
view!!.onError(null)
}
})
}
}
private fun <T> Call<T>?.enqueue(callback: Callback<LoginModel>) {
}
package com.crosspoles.service
import com.crosspoles.model.LoginModel
import okhttp3.RequestBody
import retrofit2.Call
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.PartMap
import java.util.*
interface ApiService {
@Multipart
@POST("login")
fun login(@PartMap map: HashMap<String, RequestBody>): Call<LoginModel?>?
}
我想知道这些错误是什么。如果需要更多了解任何其他代码,请通知我。根据问题下评论中的讨论和额外发布的代码,我假设,并且基本上可以肯定,问题是传递到
排队
函数中的回调对象类型错误
当前,enqueue函数接收类型为Callback
的对象:
由于login(map)
返回可选的Call
对象,因此在调用enqueue
之前放置了问号
确保更新Callback
对象onResponse
和onFailure
函数实现(注意问号):
override-onResponse(call:call,…){…}
覆盖失败(调用:调用…{…}
删除空的扩展函数,因为它没有任何用途。onFailure()中可丢弃对象的字符串是什么?它抛出了网络错误,但在我的情况下,这些函数不工作或覆盖了哪两个函数?onFailure和OnresponseEmpty
enqueue
函数是问题所在<代码>回调从不使用排队(回调:回调)
的参数。因此,您永远不会调用onResponse
或onFailure
函数。首先,IDE不应该要求您创建扩展函数。如果是-您可能做错了什么(很可能是将错误的类型传递到了enqueue函数中)。问题:login(map)
返回什么?您确定返回的对象具有排队
功能吗?如果它有enqueue
函数-它需要什么类型的参数?
package com.crosspoles
import android.content.Context
import android.os.StrictMode
import androidx.multidex.MultiDex
import androidx.multidex.MultiDexApplication
import com.crosspoles.service.ApiService
import com.crosspoles.service.CustomInterceptor
import com.facebook.stetho.Stetho
import com.google.gson.GsonBuilder
import com.crosspoles.extra.Constants
import io.github.inflationx.calligraphy3.CalligraphyConfig
import io.github.inflationx.calligraphy3.CalligraphyInterceptor
import io.github.inflationx.viewpump.ViewPump
import okhttp3.Cache
import okhttp3.ConnectionPool
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.scalars.ScalarsConverterFactory
import java.io.File
import java.util.*
import java.util.concurrent.TimeUnit
class CrosspolesApp : MultiDexApplication() {
var isAidl = false
var apiService: ApiService? = null
private set
override fun onCreate() {
super.onCreate()
instance = this
MultiDex.install(applicationContext)
createApiService()
val builder = StrictMode.VmPolicy.Builder()
StrictMode.setVmPolicy(builder.build())
ViewPump.init(ViewPump.builder()
.addInterceptor(CalligraphyInterceptor(
CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/open_sans_regular.ttf")
.setFontAttrId(R.attr.fontPath)
.build()))
.build())
Stetho.initializeWithDefaults(this)
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
}
fun createApiService(): ApiService? {
val gson = GsonBuilder().create()
val httpCacheDirectory = File(cacheDir, "cache_file")
val cache = Cache(httpCacheDirectory, 20 * 1024 * 1024)
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.connectionPool(ConnectionPool(0, 5 * 60 * 1000, TimeUnit.SECONDS))
.addInterceptor(CustomInterceptor(instance, Locale.getDefault().language, appVersion))
.cache(cache)
.build()
val retrofit = Retrofit.Builder().client(okHttpClient)
.baseUrl(Constants.BASE_crosspoles_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
apiService = retrofit.create(ApiService::class.java)
return apiService
}
private val appVersion: String
private get() = try {
packageManager.getPackageInfo(packageName, 0).versionName
} catch (e: Exception) {
e.printStackTrace()
"1.1"
}
companion object {
var instance: CrosspolesApp? = null
private set
}
}
CrosspolesApp.instance
?.apiService
?.login(map).enqueue(object: Callback<LoginModel> { ... })
CrosspolesApp.instance
?.apiService
?.login(map)?.enqueue(object: Callback<LoginModel?> { ... })
override fun onResponse(call: Call<LoginModel?>, ...) { ... }
override fun onFailure(call: Call<LoginModel?>, ...) { ... }