如何从内部AsyncTask类中的doInBackground调用外部类函数?

时间:2016-01-10 17:13:18

标签: java android android-asynctask

我还没有找到解决问题的方法......我必须从内部类中调用外部类方法。这是我的代码(缩写):

public class FileBrowser extends ListActivity implements OnClickListener {

    public void bgTasksFinished(String doneTask, int result) {

        switch(doneTask) {

            case doEncrypt:
                doSomething();
                break;

            case doDecrypt:
                doAnotherThing();
                break;
        }

    private class BgTasks extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(String... params) {

            bgTasksFinished(doneTask, result); // outer class method
        }
    }
}

......但这不起作用。

调试时我得到了这个(等等):

01-10 18:34:10.357: E/AndroidRuntime(29038): FATAL EXCEPTION: AsyncTask #1
01-10 18:34:10.357: E/AndroidRuntime(29038): Process: de.zpit2u.crypt, PID: 29038
01-10 18:34:10.357: E/AndroidRuntime(29038): java.lang.RuntimeException: An error occured while executing doInBackground()
01-10 18:34:10.357: E/AndroidRuntime(29038):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
01-10 18:34:10.357: E/AndroidRuntime(29038):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)

不调试应用程序只会崩溃(调用外部类方法)。

1 个答案:

答案 0 :(得分:1)

只能在Asynctask.onPostExecute方法中调用外部类方法。这是因为doInBackground方法实际上是另一个线程,因此您将其视为完全在另一个类中。

查看开发人员文档或one在线提供的优秀教程many

在你的情况下,而不是:

private class BgTasks extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {

        bgTasksFinished(doneTask, result); // outer class method
    }
}

尝试:

private class BgTasks extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        return doneTask;
    }
    @Override
    protected void onPostExecute(String doneTask) {
        bgTasksFinished(doneTask, result); // outer class method
    }
}