在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子。在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数据。因为它封装的很好了,并不需要我们去做封装,只需要写少量的代码就可以获取到复杂的网络数据了。

一、OKhttp的最基本使用。

还是直接使用代码来说话:

1、添加依赖:

Github网址:https://github.com/square/okhttp

  1. compile 'com.squareup.okhttp3:okhttp:3.5.0'

2、等待构建成功后:在主活动中直接使用它的API

1、创建布局文件:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical" >
  5. <Button
  6. android:id="@+id/send_request"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="Send Request" />
  10. <ScrollView
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent" >
  13. <TextView
  14. android:id="@+id/response"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content" />
  17. </ScrollView>
  18. </LinearLayout>

2、主活动中的代码:

  1. public class MainActivity extends Activity implements View.OnClickListener {
  2.  
  3. private Button sendRequest;
  4. private TextView responseText;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. sendRequest = (Button) findViewById(R.id.send_request);
  11. responseText = (TextView) findViewById(R.id.response);
  12. sendRequest.setOnClickListener(this);
  13. }
  14. @Override
  15. public void onClick(View v) {
  16. if (v.getId() == R.id.send_request) {
  17. sendRequestWithOKHttp();
  18. }
  19. }
  20. private void sendRequestWithOKHttp() {
  21. // 开启线程来发起网络请求
  22. new Thread(new Runnable() {
  23. @Override
  24. public void run() {
  25. try {
  26. OkHttpClient client = new OkHttpClient();
  27. Request request = new Request.Builder()
  28. .url("http://www.baidu.com")
  29. .build();
  30. Response response = client.newCall(request).execute();
  31. String responseData = response.body().string();
  32. show(responseData);
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }).start();
  38. }
  39.  
  40. public void show(final String finalDatas){
  41. runOnUiThread(new Runnable() {
  42. @Override
  43. public void run() {
  44. responseText.setText(finalDatas);
  45. }
  46. });
  47. }
  48.  
  49. }

这样我们就成功获取到了网络的数据,运行程序我们可以看到:

二、使用OKhttp提供的接口回调

1、定义一个HttpUtils类。加入如下静态方法:

  1. //使用OKhttp,OKhttp给封装好了回调,我们直接使用即可
  2. public static void sendOKHttpRequst(final String address, final okhttp3.Callback callback){
  3. new Thread(new Runnable() {
  4. @Override
  5. public void run() {
  6. OkHttpClient client = new OkHttpClient();
  7. Request request = new Request.Builder()
  8. .url(address)
  9. .build();
  10. client.newCall(request).enqueue(callback);
  11. }
  12. }).start();
  13. }

2、使用工具类,使用回调方法

  1. //使用OKhttp工具类
  2. findViewById(R.id.btn_okhttp).setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. HttpUtils.sendOKHttpRequst(address, new Callback() {
  6. @Override
  7. public void onFailure(Call call, IOException e) {
  8. //对异常情况处理
  9. Log.e("MainActivity","错误信息是" + e.toString());
  10. }
  11.  
  12. @Override
  13. public void onResponse(Call call, final Response response) throws IOException {
  14. //得到服务器返回的数据response
  15. runOnUiThread(new Runnable() {
  16. @Override
  17. public void run() {
  18. try {
  19. mTextView.setText(response.body().string());
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. });
  25. }
  26. });
  27. }
  28. });
  29. }

这里只需要给出主活动的代码即可~,因为封装的太好,我们只需要几行代码就可以完成功能。还需要注意的是,谷歌工程师给封装业务逻辑是在子线程执行的,因此我们要更新数据要在主线程执行。运行程序接口是一样的~

喜欢我的朋友可以关注我,本专栏不定期更新简单有趣的安卓小文~

对于OKHttp更高级的用法,以后会在Android Studio精彩案例专栏里面进行细致详细的分析

Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》的更多相关文章

  1. Android简易实战教程--第四十三话《上拉加载与下拉刷新》

    ListView的下拉刷新很常见,很多开源的框架都能做到这个效果,当然也可以自己去实现.本篇案例是基于xlistview的. 布局: <RelativeLayout xmlns:android= ...

  2. Android简易实战教程--第四十话《Spinner》

    对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <?xml version=&q ...

  3. Android简易实战教程--第三十七话《NotifiCation》

    通知的使用,无疑是Android系统的亮点之一:就连IOS在5.0开始也引入了类似通知的技巧.可见它的实用性. 今天这个小案例,就学习一下通知的基本使用,API是使用最新的API,4.3以前创建通知的 ...

  4. Android简易实战教程--第五十话《动画扫描》

    祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...

  5. Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》

    之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...

  6. Android简易实战教程--第四十二话《Spinner下拉级联效果》

    本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...

  7. Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...

  8. Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》

    之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...

  9. Android简易实战教程--第四十九话《满屏拖动的控件》

    今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点3分钟看完. 说的很高大上,其实就是拖动Button按钮跟着鼠标位置满手机屏幕跑罢了. 直接上简单的代码吧: public class Main ...

随机推荐

  1. 完成 bass 库的频谱显示效果图

    效果如图所示,比 bass 官方自带的例子效果要好那么一点点(峰值有滞留)...

  2. ABP框架 - 我的第一个Web API

    本文示例源代码地址https://github.com/lcyhjx/abp-training 上一篇我们已经对ABP是什么,能做什么.有了一个印象.那么接下来我们将动手使用ABP框架快速开发一个AP ...

  3. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新

    unity热更新是一个经久不衰的话题.除了最常见的lua之外,还有如JSBinding,C#等等.这里介绍一个使用ECMAScript4进行热更新的方案.它吸收了各家的优点,特色很鲜明. 项目地址: ...

  4. Python系列之 - 面向对象(2)

    类的三大特性 类的三大特性包括: 封装.继承.多态 一 封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...

  5. Python系列之 - 线程基础

    一.什么是线程 线程:顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才 ...

  6. Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper

    Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口: 对数据库中一张表的增删改查 ...

  7. js高阶函数应用—函数柯里化和反柯里化(二)

    第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...

  8. hdu 5869 区间不同GCD个数(树状数组)

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  9. ●BZOJ 4556 [Tjoi2016&Heoi2016]字符串

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4556 题解: 巨恶心...但是题很好呀,可以练习好几个比较麻烦的算法~ 1).预处理 首先用 ...

  10. hdu 5340 (manacher)

    Sample Input 2 abc abaadada   Sample Output Yes No 判断是否能成为3个非空回文子串 manacher算法求出个点回文长度,在找出第一个和最后一个保存下 ...