对象实例作为JobIntentService的参数

时间:2018-10-10 12:18:30

标签: android kotlin

我正在构建一个临时演示应用程序,我需要一种每分钟轮询一次服务器的服务。 (我知道对此有更好的机制)。现在,我有一个称为APIHandler的类,我的MainActivity和服务都应使用。在为我的APIHandler类的实例提供服务时遇到了问题。因此,我基本上想要的是我的服务能够使用我的APIHandler实例。无法将APIHandler类设为静态,因为它需要一个需要上下文实例的Volley.newRequestQueue对象。

这就是我从MainActivity启动服务的方式

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setup()
        apiHandler = APIHandler(this) //I neeed this instance...
        PollingService.enqueueWork(this, Intent(this, PollingService::class.java))
    }

这是我的服务

class PollingService(private val apiHandler: APIHandler) : JobIntentService() {
    private val timer = Timer()
    private val tag = "PollingService"
    //To be present here!

    companion object {
        fun  enqueueWork(context: Context, work: Intent) {
            enqueueWork(context, PollingService::class.java, 1, work)
        }
    }

    override fun onHandleWork(intent: Intent) {
        Log.d(tag, "Starting")
        timer.scheduleAtFixedRate(timerTask {
            run {
                Log.d(tag, "Polling...")
                apiHandler.getLEDState(1)
                apiHandler.getLEDState(2)
            }
        }, 0, 5000)
    }

    override fun onBind(intent: Intent): IBinder? {
        return null
    }

    override fun onDestroy() {
        this.timer.cancel()
        super.onDestroy()
    }
}

1 个答案:

答案 0 :(得分:0)

如果仅需要上下文,则可以在onHandleWork函数中获取它,请参见下文(对不起,我使用Java而不是Kotlin):

@Override
protected void onHandleWork(@NonNull Intent intent) {
    Context context = getApplicationContext();
    // Instantiate your APIHandler with the context here
}

尝试将其复制粘贴到您的项目中,以使AS自动为您将其转换为Kotlin。