无法通过`cls.newInstance()`创建异步任务的实例?

时间:2012-10-31 12:18:13

标签: android android-asynctask instantiation

android代码很简单:

public void createNewTask(View v) {
    try {
        MyTask task = MyTask.class.newInstance();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private class MyTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        return null;  
    }
}

但是在调用createNewTask方法时,它会抛出异常:

Caused by: java.lang.RuntimeException: 
    java.lang.InstantiationException: com.example.MyActivity$MyTask
    at com.example.MyActivity.createNewTask(MyActivity.java:214)
    ... 14 more
    Caused by: java.lang.InstantiationException: com.example.MyActivity$MyTask
    at java.lang.Class.newInstanceImpl(Native Method)
    at java.lang.Class.newInstance(Class.java:1440)
    at com.example.MyActivity.createNewTask(MyActivity.java:211)

但如果我选择另一个班级,例如

MyActivity task = MyActivity.class.newInstance();

一切都会好的。

我的代码出了什么问题?我在Android 2.3.6安卓手机上测试过它。

2 个答案:

答案 0 :(得分:2)

找到两种方法来解决这个问题:

public static class MyTask {
}

private static class MyTask {
    public MyTask(){}
}

根据documentation

  

InstantiationException - 如果此Class表示抽象类,   接口,数组类,基本类型或void;或者如果   class没有nullary构造函数;或者如果实例化失败了   其他一些原因。

尝试在您的班级中添加无效构造函数:

public MyTask() {}

修改

根据this documentation

  

Class.newInstance()要求构造函数可见;   Constructor.newInstance()可以调用私有构造函数   某些情况。

答案 1 :(得分:0)

我想,原因是AsyncTask是抽象类,但Activity不是。

私有类不能像你一样实例化