如何修复错误“无法实例化服务* <*。TimerIntentService>没有零参数构造函数”

时间:2019-09-07 11:11:14

标签: android android-fragments kotlin android-intentservice

我正在将计时器设置为我的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)

2 个答案:

答案 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){ }

仅此而已。