Экземпляр объекта в качестве аргумента для JobIntentService - PullRequest
0 голосов
/ 10 октября 2018

Я создаю временное демонстрационное приложение, и мне нужна служба, которая опрашивает сервер каждую минуту.(Я знаю, что есть лучшие механизмы для этого).Теперь у меня есть класс, который я называю 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 голосов
/ 10 октября 2018

Если вам нужен только контекст, вы можете получить его в функции onHandleWork, см. Ниже (извините, я использую Java вместо Kotlin):

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

Попробуйте скопировать этов ваш проект, чтобы AS автоматически преобразовал его в Kotlin для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...