接口回调(可以用接口回调来实现线程之间数据传递)

代码如下所示:

public class MainActivity extends AppCompatActivity {
    private Button button;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        textView = (TextView) findViewById(R.id.textView2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                HttpUtil.getResponse(new huidiao() {
                    @Override
                    public void onSuccess(final String s) {
                        Log.i("xinxi",s);
                       /* 输出结果为:
                        <!DOCTYPE html>
                        <!--STATUS OK--><html> <head><meta h
                        ttp-equiv=content-type content=text/htm
                        l;charset=utf-8><meta http-equiv=X-UA-Compda class=mnav>贴吧</a> <noscript> <a href=h
                                > </p> <p id=cp>&copy;2017&nbsp;Baidu&n.......bsp;<a href=http://www.baidu.com/duty/
                        // >使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈<
                        // /a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div>
                        // </div> </body> </html>*/
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText(s);
                            }
                        });
                    }

                    @Override
                    public void onFailure(Exception e) {

                    }
                });
            }
        });
    }
}

在HttpUtil.java文件中

public class HttpUtil {
    public static void getResponse(final huidiao huidiao){
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                Request request = new Request.Builder()
                        .url("http://www.baidu.com")
                        .build();
                Response response = null;
                try {
                    response = okHttpClient.newCall(request).execute();
                    final String responsedata = response.body().string();//responsedata这个栈的地址指向了response.body().string()所在的堆的地址
                    huidiao.onSuccess(responsedata);//这一步将responsedata传到了onSuccess方法中,相当于将MainActivity中的onSuccess方法中参数s指向了responsedata所指向的堆的地址
                } catch (IOException e) {
                    huidiao.onFailure(e);
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

在huidiao.java文件中

public interface huidiao {
    void onSuccess(String s);
    void onFailure(Exception e);
}

再来一个例子,在okhttp中的接口回调,可以进行二者的对比

public class MainActivity extends AppCompatActivity {
    private Button button;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        textView = (TextView) findViewById(R.id.textView2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                HttpUtil.getResponse(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, final Response response) throws IOException {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    textView.setText(response.body().string());
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                });
            }
        });
    }
}

在HttpUtil.java文件中

public class HttpUtil {
    public static void getResponse(Callback callback){
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .build();
        okHttpClient.newCall(request).enqueue(callback);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,290评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,799评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,288评论 19 139
  • 七月买的书。下定决心要学好英语了。然后是瑜伽。接着可能是化妆。 先将英语学好再说。
    伟几声阅读 1,499评论 0 0
  • 0521今天的作业: 在你脑海里,印象深刻的故事有哪些?为什么你记住了它们,而忘记了其他的。 故事的巨大威力 1....
    马克图布了阅读 1,724评论 0 0

友情链接更多精彩内容