5

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を搭載したAndroid携帯でテストしました。

4

2 に答える 2

2

この問題を解決する方法は 2 つあります。

public static class MyTask {
}

また

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

ドキュメントによると:

InstantiationException - この Class が抽象クラス、インタフェース、配列クラス、プリミティブ型、または void を表している場合。または、クラスに nullary コンストラクターがない場合。または、インスタンス化が他の理由で失敗した場合。

クラスに nullary コンストラクターを追加してみてください。

public MyTask() {}

編集

このドキュメントによると:

Class.newInstance() は、コンストラクターが表示されている必要があります。Constructor.newInstance() は、特定の状況下でプライベート コンストラクターを呼び出す場合があります。

于 2012-10-31T12:35:59.737 に答える
0

理由はAsyncTask抽象クラスだと思いますが、そうではありActivityません。

そして、あなたのようにプライベートクラスをインスタンス化することはできません

于 2012-10-31T12:25:23.680 に答える