Java Android-如何将接口传递给AsyncTask

Java Android-如何将接口传递给AsyncTask,java,android,android-asynctask,Java,Android,Android Asynctask,我试图弄清楚如何创建一个异步任务,在后台运行我的php API代码,然后在完成后通知我的MainActivity。我已经读了好几个小时的教程,尝试了很多东西,现在我很沮丧,因为我找不到任何地方可以回答我的问题 我创建了AsyncTask并成功运行,我可以将API返回的信息记录在onPostExecute中,但我无法确定如何向MainActivity发出任务已完成的警报。我不知道该把什么传递到APICall的创建中。我阅读的每个教程都显示AsyncTask构造函数将接口作为参数,如下面的代码所示,

我试图弄清楚如何创建一个异步任务,在后台运行我的php API代码,然后在完成后通知我的MainActivity。我已经读了好几个小时的教程,尝试了很多东西,现在我很沮丧,因为我找不到任何地方可以回答我的问题

我创建了AsyncTask并成功运行,我可以将API返回的信息记录在onPostExecute中,但我无法确定如何向MainActivity发出任务已完成的警报。我不知道该把什么传递到APICall的创建中。我阅读的每个教程都显示AsyncTask构造函数将接口作为参数,如下面的代码所示,但是如何将接口作为参数传递

MainActivity.java(实现OnTaskCompleted)

OnTaskCompleted.java

public interface OnTaskCompleted {
public void onTaskCompleted();
}
APICall.java(扩展异步任务)


您应该将侦听器的引用传递给APICall类:

APICall api = new APICall(MainActivity.this);
APICall api=新APICall(?我在这里放什么??)

我在这里放什么

在本例中,实现侦听器的是
main活动

APICall api = new APICall(MainActivity.this);

很简单,您可以像这样使用匿名接口实例

myButton4.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                APICall api = new APICall(new OnTaskCompleted() {
                    @Override
                    public void onTaskCompleted() {

                    }
                });
                api.execute("users");
            }});
或者您也可以像这样在类级别实现接口

public class MainActivity extends Activity implements MainActivity.OnTaskCompleted {


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        myButton4.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                APICall api = new APICall(MainActivity.this);
                api.execute("users");
            }});

    }

    @Override
    public void onTaskCompleted() {

        // Do your code on task complete
    }

}

啊,太好了!我一直在寻找这个。你让我的夜晚现在我可以安睡了:)谢谢你!您最好在AsyncTask中将此侦听器放在WeakReference中,以避免泄漏和访问死掉的UI实例!但我也有同样的问题。如果您在传递上下文/活动时传递了该上下文/活动,那么自本次讨论以来已经有很长时间了!但我也有同样的问题。当您在asynctask this.listener=listener的构造函数中执行此操作时,您必须具有非法强制转换吗?
myButton4.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                APICall api = new APICall(new OnTaskCompleted() {
                    @Override
                    public void onTaskCompleted() {

                    }
                });
                api.execute("users");
            }});
public class MainActivity extends Activity implements MainActivity.OnTaskCompleted {


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        myButton4.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                APICall api = new APICall(MainActivity.this);
                api.execute("users");
            }});

    }

    @Override
    public void onTaskCompleted() {

        // Do your code on task complete
    }

}