gpt4 book ai didi

java - 由于找不到构造函数,从类对象动态实例化 AsyncTask 失败

转载 作者:行者123 更新时间:2023-11-29 06:05:54 24 4
gpt4 key购买 nike

在我的应用程序启动过程中,我有几件事需要异步完成。我创建了一个派生自 AsyncTask 的抽象类,它实现了这些加载任务的共同点:

protected abstract class LoadTask extends AsyncTask<Object, Void, Object>{
MainActivity activity;
void detach(){
activity = null;
}
void attach(MainActivity a){
activity = a;
}

public LoadTask(MainActivity a){
super();
attach(a);
}

public abstract boolean shouldRun();

@Override
protected void onPostExecute(Object result){
activity.onFinishLoad(this.getClass(), result);
}
}

下面是具体子类的一个具体实现:

public class ItemInfoLoadTask extends LoadTask{

public ItemInfoLoadTask(MainActivity a){
super(a);
}

public boolean shouldRun(){
return should_reload("items", item_info_path);
}

@Override
protected Object doInBackground(Object ... params) {
setProgressMessage("Reading item info...");
JSONObject result = loadItemInfo();
return result;
}

private JSONObject loadItemInfo(){
return Util.parseJSONObject(item_info_path);
}
}

下面是在我的 Activity 的 onCreate() 方法中调用它们的代码:

Log.v(TAG, c.getName());
Class[] types = {MainActivity.class};
Constructor construct = c.getConstructor(types);
task = (LoadTask)(construct.newInstance(this));

这是日志:

12-17 10:26:25.750: V/MainActivity(25188): com.mycompany.mypackage.MainActivity$ItemInfoLoadTask
12-17 10:26:25.760: E/MainActivity(25188): this shouldn't happen
12-17 10:26:25.760: E/MainActivity(25188): java.lang.NoSuchMethodException: <init> [class com.mycompany.mypackage.MainActivity]
12-17 10:26:25.760: E/MainActivity(25188): at java.lang.ClassMembers.getConstructorOrMethod(ClassMembers.java:235)
12-17 10:26:25.760: E/MainActivity(25188): at java.lang.Class.getConstructor(Class.java:459)
12-17 10:26:25.760: E/MainActivity(25188): at com.mycompany.mypackage.MainActivity.onCreate(MainActivity.java:80)
12-17 10:26:25.760: E/MainActivity(25188): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
12-17 10:26:25.760: E/MainActivity(25188): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
12-17 10:26:25.760: E/MainActivity(25188): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
12-17 10:26:25.760: E/MainActivity(25188): at android.app.ActivityThread.access$1500(ActivityThread.java:122)
12-17 10:26:25.760: E/MainActivity(25188): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
12-17 10:26:25.760: E/MainActivity(25188): at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 10:26:25.760: E/MainActivity(25188): at android.os.Looper.loop(Looper.java:132)
12-17 10:26:25.760: E/MainActivity(25188): at android.app.ActivityThread.main(ActivityThread.java:4028)
12-17 10:26:25.760: E/MainActivity(25188): at java.lang.reflect.Method.invokeNative(Native Method)
12-17 10:26:25.760: E/MainActivity(25188): at java.lang.reflect.Method.invoke(Method.java:491)
12-17 10:26:25.760: E/MainActivity(25188): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
12-17 10:26:25.760: E/MainActivity(25188): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-17 10:26:25.760: E/MainActivity(25188): at dalvik.system.NativeStart.main(Native Method)

我不知道我做错了什么。如果有任何关系(虽然我不明白为什么应该),LoadTask 和 ItemInfoLoadTask 是 MainActivity 中的内部类

最佳答案

非静态内部类包含对封闭类实例的隐式引用。这些内部类的所有构造函数都将引用封闭类的实例作为参数。

一个简单的例子:

import java.lang.reflect.*;

class Foo {
class Bar {
public Bar(int a) {
}
}

public static void main(String[] args) {
for(Constructor c: Bar.class.getDeclaredConstructors()) {
System.out.println(c);
}
}
}

打印 public Foo$Bar(Foo,int) - 注意第一个 Foo 参数。javap工具可以显示有关结构的信息 - Foo$Bar.class 的声明字段、方法和构造函数:

Compiled from "Foo.java"
class Foo$Bar extends java.lang.Object{
final Foo this$0;
public Foo$Bar(Foo, int);
}

在这里您可以看到对父级的隐式引用。 JVM 不知道内部类,因此编译器必须引入合成方法和字段来实现所需的行为。在您需要反射之类的东西之前,它通常不会被注意到。

在您的特定情况下,您可以将内部类设为静态,这样就不会有隐式引用,或者删除对 MainActivity 的显式引用。

关于java - 由于找不到构造函数,从类对象动态实例化 AsyncTask 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8543570/

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