java - 使用来自 AsyncTask 的响应作为回调

标签 java android android-asynctask

我希望能够在调用 asynctask 的类中存在的 onPostExecute() 中调用一个方法 - 我该怎么做?

我的意思是,当我调用 AsyncTask 时:

public class MainActivity extends AppCompatActivity {

    public function onButtonClick() {
        String url = "http://sampledomain.pl/test.php";
        String params = "";
        new Api().execute(url, params);
    }

    public function changeText(String response)
    { 
        TextView txt = (TextView) findViewById(R.id.text);
        txt.setText(response);
    }

}

我希望能够从 onPostExecute 方法中调用 changeText 方法,如下所示:

public class Api extends AsyncTask<String, Void, String> {
    // ...
    @Override
    public void onPostExecute(String response)
    {
        MainActivity obj = new MainActivity();
        obj.changeText(response);
    }

}

我在这里看到两个问题:

  1. 它不起作用,我不断收到 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null对象引用错误

  2. 我希望此类更通用,这意味着我想在 MainActivity 类而不是 Api 类中指定要执行的方法。

我该如何解决这个问题?

最佳答案

首先你应该创建一个回调接口(interface)。该代码是通用的,您可以在应用程序的其他地方使用它。

public interface Callback<T>{
    void execute(T result);
}

然后您必须修改您的AsyncTask,以便在构造函数中接受Callback 作为参数。

public class Api extends AsyncTask<String, Void, String> {
    public final Callback<String> callback;

    public Api(Callback callback) {
        this.callback = callback;
    }

    // other methods ...

    @Override
    public void onPostExecute(String response) {
        callback.execute(response);
    }
}

然后您可以将callback 放入您的AsyncTask

public void onButtonClick() {
    String url = "http://sampledomain.pl/test.php";
    String params = "";
    new Api(new Callback<String>() {
        @Override
        public void execute(String result) {
            changeText(result);
        }
    }).execute(url, params);
}

关于java - 使用来自 AsyncTask 的响应作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34375170/

相关文章:

java - Android无法显示部分通过socket传输的图像

java - Java 中的负短路到 NDK 中的 uint16_t 未正确处理?

android - 如何在 Titanium 中使用 Android Material Theme Design 属性(彩色状态栏,...)

android - 防止asynctask被多次执行

android - 在 Android 中进行异步服务调用的方法?什么时候使用哪个?

java - 当表数据更改时,JTable 多选会失去选择

java - UDP停止等待: identifying false messages

java - AsyncTask执行后如何取消?

java - 在自己的主体中测试类是个好主意吗?

android - 如何在进入新 Activity 之前终止线程和处理程序