gpt4 book ai didi

java - 服务 "has no zero argument constructor",但确实如此。该怎么办?使类静态?

转载 作者:太空狗 更新时间:2023-10-29 13:13:50 25 4
gpt4 key购买 nike

我有一个运行良好的 Android 应用程序,但我希望它能够在后台运行并在没有焦点时继续运行。

QueryDB(见下文)在应用的当前版本中扩展了 AsyncTask。我被建议使用 Service(或 IntentSerivce)来实现上述目标。

所以我更改了 QueryDB 以扩展 IntentService 以供初学者使用。

这样做在 Android Studio 1.5.1 中导致了这个异常:

04-29 12:02:45.544 1523-1523/com.dslomer64.wordyhelperton E/AndroidRuntime: 
FATAL EXCEPTION: main

Process: com.dslomer64.wordyhelperton, PID: 1523

java.lang.RuntimeException: Unable to instantiate service
com.dslomer64.wordyhelperton.DatabaseConnector$QueryDB:
^^^^^^^
java.lang.InstantiationException:
java.lang.Class<com.dslomer64.wordyhelperton.DatabaseConnector$QueryDB>
has no zero argument constructor

at android.app.ActivityThread.handleCreateService(ActivityThread.java:2880)
at android.app.ActivityThread.access$1900(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1439)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5551)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)


Caused by: java.lang.InstantiationException:
java.lang.Class<com.dslomer64.wordyhelperton.DatabaseConnector$QueryDB>
^^^^^^^
has no zero argument constructor


at java.lang.Class.newInstance(Native Method)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2877)
at android.app.ActivityThread.access$1900(ActivityThread.java:157) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1439) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5551) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 

这是导致错误的 QueryDB 的开始:

 public class QueryDB extends IntentService
{
public QueryDB()
{
super("QueryDB");
}

public QueryDB(String name)
{
super(name);
}

QueryDB,与错误相关联,是 DatabaseConnector 中的一个类。

在大量谷歌搜索和跟踪 SO 链接之后,我找到了一个 SO Answer,它建议将类 QueryDB static。这样做消除了上述错误。

但是由于将 QueryDBAsyncTask 更改为 IntentService 是我所做的唯一更改,所以我得到了另一个我认为的错误我知道该怎么做,但我还有很长的路要走,我不希望这种变化回来咬我一口。

QueryDB 执行并终止后,它将在用户进一步输入后再次执行。

如果我只需要在任何时候执行它的一个实例,那么是否使类 QueryDB static 完全安全并且是一个好主意?我认为它必须是 DatabaseConnector 的内部类。

编辑

根据第一条评论中的建议,this将被证明是有趣的阅读。

所以可能 this .

最佳答案

与您直接处理的 AsyncTask 不同,Service 是一个组件,它应该由操作系统注册/索引。因此,您对组件的生命周期有间接影响。如果 IntentService 作为内部类实现,它应该是静态的,否则 Android 系统将无法启动该服务。此外,正确的注册看起来像

<service android:name=".MyEnclosedClass$MyIntentService" />

至于静态类的安全性(通常),内存泄漏可能是个问题。在提供对静态对象的引用时应该小心,因为它可能比(由于配置更改)封闭对象 (EO) 存在时间更长,因此垃圾收集器无法回收 EO。

关于java - 服务 "has no zero argument constructor",但确实如此。该怎么办?使类静态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36945957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com