【问题标题】:Dependency injection with IntentService doesn't work使用 IntentService 进行依赖注入不起作用
【发布时间】:2019-11-15 19:11:57
【问题描述】:

我想创建在许多活动中向服务器发送数据的 TCP_Client。我决定使用依赖注入将所有配置相同的客户端注入所有客户端。不幸的是,它在开始时停止工作。

我的应用模块

val appModule = module {
    single<ConnectionService> { ConnectionServiceTcp("192.168.0.1", 8888) }
}

主要应用

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidContext(this@MainApplication)
            androidLogger()
            modules(appModule)
        }
    }
}
class ConnectionServiceTcp(private val ipAddress: String, private val port : Int)
    : IntentService("TCP_CLIENT"), ConnectionService {

    private var client : Socket? = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        super.onStartCommand(intent, flags, startId)
        return START_STICKY
    }

    override fun onHandleIntent(intent: Intent?) {
        startTcpServer()
    }

    private fun startTcpServer() {
        client = Socket(ipAddress, port)
    }


    override fun isConnectedToServer(): Boolean {
        Log.println(Log.INFO, null, "Adres = ${client?.localAddress} port = ${client?.localPort}")
        return false
    }

}
class MainActivity : AppCompatActivity() {

    private val connectionService : ConnectionService by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        startTcpServer()
    }

    private fun startTcpServer() {
        val serverTcp = Intent(this, ConnectionServiceTcp::class.java)
        startService(serverTcp)
    }


然后我收到

    java.lang.RuntimeException: Unable to instantiate service connection.impl.ConnectionServiceTcp: java.lang.InstantiationException: java.lang.Class<connection.impl.ConnectionServiceTcp> has no zero argument constructor

我找不到注入后台客户端以发送 TCP 请求的方法

【问题讨论】:

    标签: android kotlin dependency-injection koin


    【解决方案1】:

    就像活动、片段或其他一些平台组件一样,Android 系统暗示服务应该有一个单一的无参数构造函数。系统在 Service 类中查找默认构造函数并使用反射调用它。这就是为什么禁止添加非默认构造函数(即带参数的构造函数)的原因。

    要将依赖项注入到服务中,您应该执行与活动中相同的操作(声明一个字段并使用 by inject() 委托注入它。因此最终代码如下所示:

    class ConnectionServiceTcp()
        : IntentService("TCP_CLIENT"), ConnectionService {
    
        private val ipAddress: String by inject()
        private val port : Int by inject()
        private var client : Socket? = null
    
        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
            super.onStartCommand(intent, flags, startId)
            return START_STICKY
        }
    
        override fun onHandleIntent(intent: Intent?) {
            startTcpServer()
        }
    
        private fun startTcpServer() {
            client = Socket(ipAddress, port)
        }
    
        override fun isConnectedToServer(): Boolean {
            Log.println(Log.INFO, null, "Adres = ${client?.localAddress} port = ${client?.localPort}")
            return false
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2016-06-12
      • 1970-01-01
      • 2023-02-24
      • 2015-09-26
      • 2014-01-19
      相关资源
      最近更新 更多