java - 如何从内部 AsyncTask 类的 onPostExecute 方法修改外部字段?

标签 java android android-asynctask

在以下代码 fragment 中:

public class ExternalClass {
    private int num = 1;

    public void backgroundTask() {
        new HttpTask().execute();
    }

    public int getNum() {
        return num;
    }

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

        @Override
        protected String doInBackground(String... params) {
            //Do stuff...
        }

        @Override
        protected void onPostExecute(String result) {
            //Do stuff...
            ExternalClass.this.num = 2;
    }
}

在 Activity 中:

...
ExternalClass ec = new ExternalClass();
ec.backgroundTask();
int myNum = ec.getNum(); //NUM IS 1, NOT 2!!

我做错了什么?一切正常,我的 doInBackground() 和 onPostExecute() 成功完成,但字段“num”没有改变。我尝试了“num = 2”甚至“this.num = 2”(我知道这是不正确的,但是......)。

最佳答案

您将需要使用AsyncTask.get()doInBackground() 执行完成时,从 AsyncTask 返回主 UI 线程结果的方法

public void backgroundTask() {
        new HttpTask().execute().get();
    }

注意:当您在主 UI 线程中调用 AsyncTask 的 get() 方法时,这将停止主线程的执行。您需要从后台线程调用 backgroundTask() 方法

关于java - 如何从内部 AsyncTask 类的 onPostExecute 方法修改外部字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14752109/

相关文章:

java - 如何从 android (CallLog.Calls.CONTENT_URI) 表中获取联系人姓名?

android - MXPlayer 和 MoboPlayer 等 Media Player Android 应用程序如何播放不受支持的文件格式(如 MKV)?

java - 替换 JavaFX GridPane 中(行,列)处的节点

java - JCA访问集群中的文件

android - 在更改 GridView 以链接 xml 布局时显示 log cat 错误

android - phonegap 地理定位不起作用

java - android 将 String 数组和 String 传递给 asyncTask

android - 如何在mysql和sqlite之间同步数据?

Android- 使用 ViewHolder 和 AsyncTask 加载联系人- 缩略图问题

Java 显然是按值传递,但需要一些说明