- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个运行良好的 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
。这样做消除了上述错误。
但是由于将 QueryDB
从 AsyncTask
更改为 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/
我想在我的单元测试中模拟一个遗留对象。这是构造函数: public Class LegacyClass{ public LegacyClass(Object... obj) {
此处说明https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function函数对象实例的构造函数属性“指定创建对
有没有办法从子类中的构造函数分配在父类(super class)中声明的实例变量?我已经习惯使用 BUILD() 作为构造函数,但我想知道这是否是个好主意。 IE: use v6; clas
鉴于以下情况: type AStruct struct { m_Map map[int]bool } 在这种情况下,AStruct的实例在AStruct.m_Map初始化之前不能使用: m_M
我是 Android 新手,我正在尝试学习如何使用 Gson 解析 API 调用。我已经阅读了一些内容,我正在尝试遵循这个示例:http://www.javacodegeeks.com/2011/01
我正在阅读 this文章,我不知道下面这行是做什么的。即使我删除了这一行,我也看不出有什么不同。 this.constructor.prototype.constructor.apply(this,A
这个问题已经有答案了: JsonMappingException: No suitable constructor found for type [simple type, class ]: can
我正在处理我的第一个 Flutter 项目,我正在构建一个登录页面,我创建了一个变量来存储一个 TextFormFieldController,但我收到了上面的错误,因为我删除了构造函数。当我返回这个
假设我们有以下主要和次要构造函数: open class Animal(val name:String){ internal constructor(message:InputStream): t
为什么默认复制构造函数不调用 monster 的基构造函数,但是当我在 troll 中包含一个用户定义的复制构造函数时,它会调用父级(即: 怪物) 构造函数? 我认为它的工作原理如下:创建基础对象,然
这个问题在这里已经有了答案: Is there a difference between foo(void) and foo() in C++ or C? (4 个答案) 关闭 8 年前。 我注意到
我将 T4MVC 与 MVC2 一起使用。 我有以下构建 block : 一个简单的实体接口(interface),它定义了每个 POCO 实体必须有一个 long Id属性(property): p
以下代码返回一个错误: “构造函数调用必须是构造函数中的第一个语句。” 我不明白。我的代码中的构造函数是第一条语句。我究竟做错了什么? public class labelsAndIcons exte
我是 kotlin 的新手,对它包含的所有有用的语法糖和功能感到惊讶。 但是每当我声明一个构造函数时,我都必须独立地将我的所有字段设为私有(private)。 class Result(private
作为主题,相关代码为: #include class ABC { public: ABC() { std::cout<< "default con
在 Haxe 中,我创建了一个名为 的类。我的类 喜欢: class MyClass { var score: String; public function new (score:
不确定为什么会这样,尝试删除所有 new 实例,从 const ect 切换到 let。可以运行站点,但是当我通过 html 表单运行发布请求时,在“const user = new UserSche
我是 Javascript 的新手,我正在尝试深入挖掘并理解继承、构造函数和原型(prototype)链。所以,我创建了一个构造函数, var a = function(){this.integer=
我知道 JavaScript 中的函数有双重生命,第一个是函数(作为创建实例的第一类事物),第二个是普通对象。 但是我很惊讶地看到下面控制台的输出。 function A() { consol
这个问题在这里已经有了答案: Why can't I access a property of an integer with a single dot? (5 个答案) 关闭 5 年前。 为什么
我是一名优秀的程序员,十分优秀!