Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MVP对kotlin进行改造时的Api调用问题_Java_Android_Kotlin_Retrofit2 - Fatal编程技术网

Java 使用MVP对kotlin进行改造时的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

我正在与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.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?>, ...) { ... }