我正在将计时器设置为我的android应用程序中的功能。应用基于片段。它只有两个活动和许多片段,通过导航连接。
我尝试使用Intent服务实现计时器,但是我遇到了问题。单击按钮时应用崩溃。
我试图将一些数据放入Intent服务,并且我想在其中实现计时器。
计时器从零开始,直到用户按下“暂停”。
TimerFragment.kt
class TimerFragment : ViewModelFragment<TimerViewModel>() {
val TAG = "TimerFragment"
override fun getLayoutResId() = R.layout.fragment_timer
override fun getViewModelClass() = TimerViewModel::class
lateinit var intent:Intent
lateinit var pendingIntent:PendingIntent
var mTimerRunning:Boolean = false
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btn_manage_timer.setOnClickListener(object:View.OnClickListener{
override fun onClick(p0: View?) {
// y = start time (time that is on screen)
manageTimer(p0!!,0)
}
})
}
private fun manageTimer(view: View, y:Int) {
if (!mTimerRunning) {
mTimerRunning = true
intent = Intent(this.activity, TimerIntentService::class.java)
intent.putExtra("startTime", y)
intent.putExtra("mTimerRunning", mTimerRunning)
this.activity!!.startService(intent)
Toast.makeText(this.activity, "ALARM ON", Toast.LENGTH_SHORT).show()
btn_manage_timer.text = "Pause"
}else{
mTimerRunning = false
intent.putExtra("startTime", y)
intent.putExtra("mTimerRunning", mTimerRunning)
btn_manage_timer.text = "Start"
}
return
}
}
TimerIntentService.kt
class TimerIntentService(name: String) : IntentService(name) {
private val TAG = "TimerIntentService"
public constructor(context: Context) : this("TimerIntentService"){
}
override fun onHandleIntent(p0: Intent?) {
Log.i(TAG,"onHandleIntent, Thread name ${Thread.currentThread()}")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG,"onDestroy, Thread name ${Thread.currentThread()}")
}
override fun onCreate() {
super.onCreate()
Log.i(TAG,"onCreate, Thread name ${Thread.currentThread()}")
}
}
这是完整的错误:
2019-09-07 13:08:02.944 8988-8988/* E/AndroidRuntime: FATAL EXCEPTION: main
Process: *, PID: 8988
java.lang.RuntimeException: Unable to instantiate service *.sync.TimerIntentService: java.lang.InstantiationException: java.lang.Class<*.sync.TimerIntentService> has no zero argument constructor
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3940)
at android.app.ActivityThread.access$1500(ActivityThread.java:219)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.InstantiationException: java.lang.Class<*.sync.TimerIntentService> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateService(AppComponentFactory.java:129)
at androidx.core.app.CoreComponentFactory.instantiateService(CoreComponentFactory.java:68)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3935)
at android.app.ActivityThread.access$1500(ActivityThread.java:219)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
答案 0 :(得分:0)
替换:
public constructor(context: Context) : this("TimerIntentService")
具有:
public constructor() : this("TimerIntentService")
答案 1 :(得分:0)
在您的具体实现中,您必须声明一个默认构造函数。
替换:
class TimerIntentService(name: String) : IntentService(name)
public constructor(context: Context) : this("TimerIntentService"){ }
使用:
class TimerIntentService : IntentService
constructor() : super(null){ }
仅此而已。