文章目录

  • WebView
  • HTTP
    • 使用HttpURLConnection
    • 使用OkHttp
  • 封装网络操作
    • 封装HttpURLConnection
    • 封装OkHttp

WebView

WebView 可以在 应用程序中(而不是浏览器) 展示一些网页。

布局文件 web_layout.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><WebViewandroid:id="@+id/web_view"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

活动文件:

public class WebActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.web_layout);WebView webView = findViewById(R.id.web_view);// 使WebView支持JavaScript脚本webView.getSettings().setJavaScriptEnabled(true);// 用当前WebView显示网页而不是浏览器webView.setWebViewClient(new WebViewClient());webView.loadUrl("https://www.bilibili.com/");}
}

要在 Android 中使用网络技术是需要在 AndroidManifest.xml 中声明权限的:

<uses-permission android:name="android.permission.INTERNET" />

运行结果:


HTTP

使用HttpURLConnection

布局文件 http_layout.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button_sendRequest"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送请求"/><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/response_text"android:layout_width="match_parent"android:layout_height="wrap_content"/></ScrollView></LinearLayout>
  • ScrollView控件: 以滚动形式查看屏幕外的内容。
  • TextView控件: 用以显示服务器返回的数据。

活动文件:

public class HTTPActivity extends AppCompatActivity {private static final String TAG = "HTTPActivity";TextView responseText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.http_layout);Button button_sendRequest = findViewById(R.id.button_sendRequest);responseText = findViewById(R.id.response_text);button_sendRequest.setOnClickListener(v->{sendRequestWithHttpURLConnection();Log.e(TAG, "click over");});}private void sendRequestWithHttpURLConnection() {// 开启子线程来发起网络请求new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;BufferedReader reader = null;try {URL url = new URL("https://www.csdn.net/");connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);InputStream in = connection.getInputStream();Log.e(TAG, "get in");// 下面对获取到的输入流进行读取reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while((line = reader.readLine()) != null){response.append(line);}Log.e(TAG, "run: "+response.toString());// 安卓不允许在子线程中进行UI操作// 通过runOnUiThread切换为主线程,然后将结果显示到界面中runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(response.toString());}});} catch (Exception e) {e.printStackTrace();} finally {if(reader != null){try {reader.close();} catch (IOException e){e.printStackTrace();}}if(connection != null){connection.disconnect();}}}}).start();}
}

运行结果:


使用OkHttp

OkHttp项目在github上的主页地址

build.gradle (:app) 文件的 dependencies 中添加依赖:

 // define a BOM and its versionimplementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.3"))// define any required OkHttp artifacts without versionimplementation("com.squareup.okhttp3:okhttp")

活动文件:

public class HTTPActivity extends AppCompatActivity {private static final String TAG = "HTTPActivity";TextView responseText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.http_layout);Button button_sendRequest = findViewById(R.id.button_sendRequest);responseText = findViewById(R.id.response_text);button_sendRequest.setOnClickListener(v->{sendRequestWithOkHttp();Log.e(TAG, "click over");});}private void sendRequestWithOkHttp() {// 开启子线程来发起网络请求new Thread(new Runnable() {@Overridepublic void run() {try {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://www.bilibili.com").build();Log.e(TAG, "request: "+request);Response response = client.newCall(request).execute();Log.e(TAG, "response: "+response);String responseData = response.body().string();Log.e(TAG, "responseData: "+responseData);runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(responseData);}});} catch (IOException e) {e.printStackTrace();}}}).start();}
}

运行结果:


封装网络操作

封装HttpURLConnection

如果在每个使用到网络功能的地方都实现一遍发送HTTP请求的代码无疑是繁琐的。因此,不妨将常用的网络操作写成一个个静态方法,并将它们都存储在一个类中,如:

public class HttpUtil {private static final String TAG = "HttpUtil";public static String sendHttpRequest(String address){HttpURLConnection connection = null;try {URL url =new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);connection.setDoInput(true);connection.setDoOutput(true);InputStream in = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while((line = reader.readLine()) != null){response.append(line);}return response.toString();} catch (Exception e) {e.printStackTrace();return e.getMessage();} finally {if(connection != null){connection.disconnect();}}}
}

如此一来需要发送HTTP请求时即可如此实现:

String url = "https://www.bilibili.com";
String response = HttpUtil.sendHttpRequest(url);

但这仍有缺陷,sendHttpRequest() 方法内部并没有使用子线程,这意味着调用该方法时主线程有可能被阻塞,网络请求又是耗时操作,这对于运行效率而言无疑是种灾难。

而如果只是简单地在 sendHttpRequest() 方法中开启一个线程来发起HTTP请求,那么所有的耗时逻辑都是在子线程里进行的,sendHttpRequest() 方法会在 服务器还没来得及响应 的时候就执行结束了(子线程中的逻辑还没有执行完,主线程中已经结束了对sendHttpRequest() 方法的调用)。

因此应该配以回调机制来接受回馈数据,定义一个接口:

public interface HttpCallbackListener {// 成功响应时回调,参数为服务器返回的数据void onFinish(String response);// 操作错误时回调void onError(Exception e);
}

然后修改 HttpUtil.java

public class HttpUtil {private static final String TAG = "HttpUtil";public static void sendHttpRequest(final String address, HttpCallbackListener listener){new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;try {URL url =new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);connection.setDoInput(true);connection.setDoOutput(true);InputStream in = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while((line = reader.readLine()) != null){response.append(line);}// 子线程中无法通过 return 返回数据,应通过 onFinish 方法回调if(listener != null){listener.onFinish(response.toString());Log.e(TAG, "run: "+response.toString());}} catch (Exception e) {if(listener != null){listener.onError(e);Log.e(TAG, "run: Exception");}} finally {if(connection != null){connection.disconnect();}}}}).start();}
}

此时我们调用 sendHttpRequest() 方法时需要将 HttpCallbackListener 的实例传入:

    private void sendRequestWithOkHttp() {// 开启子线程来发起网络请求new Thread(new Runnable() {@Overridepublic void run() {String url = "https://www.baidu.com";HttpUtil.sendHttpRequest(url, new HttpCallbackListener() {@Overridepublic void onFinish(String response) {runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(response);}});}@Overridepublic void onError(Exception e) {Log.e(TAG, "onError: "+e);}});}}).start();}

运行结果:


封装OkHttp

封装关于HTTP的操作:

public class HttpUtil {private static final String TAG = "HttpUtil";public static void sendHttpRequest(final String address, okhttp3.Callback callback){OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(address).build();Log.e(TAG, "request: "+request);client.newCall(request).enqueue(callback);}
}

调用 HttpUtil.sendHttpRequest() 发送请求的方法:

    // 开启子线程来发起网络请求,OkHttpprivate void sendRequestWithOkHttp(){new Thread(new Runnable() {@Overridepublic void run() {HttpUtil.sendHttpRequest("https://www.bilibili.com", new okhttp3.Callback(){@Overridepublic void onResponse(Call call, Response response) throws IOException {String responseData = response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {responseText.setText(responseData);}});}@Overridepublic void onFailure(Call call, IOException e) {Log.e(TAG, "onError: "+e);}});}}).start();}

PS: 不论是使用 HttpURLConnection 还是 OkHttp最终的回调接口都还是在子线程中,因此如果想要执行 UI 操作必须借助 runOnUiThread() 方法进行线程转换。

运行结果:

Android入门(15)| 网络相关推荐

  1. Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲)

    Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲) 准备 1.储存在raw文件夹 2. ...

  2. Qt基础与Qt on Android入门-安晓辉-专题视频课程

    Qt基础与Qt on Android入门-66107人已学习 课程介绍         本课程起始于基础的开发环境搭建和Qt Creator介绍,帮助初学者入门:着力于Qt的内在机制,由浅入深介绍信号 ...

  3. Android入门文档

    该文章为网络材料整理,部分内容经过重新编写. 一. 名词介绍 JDK:Java Development Kit Java 语言的软件开发工具包 JRE:Java Runtime Environment ...

  4. 我认为的android入门学习策略

    我认为的android入门学习策略 初级阶段要学习的内容 1.自己配置环境.  全部采用做新版本 SDK,ADT,ECLIPSE,JDK 2.编写或者运行教学示例.  2.1这时间主要运行的示例如HE ...

  5. 小猪的Android入门之路 Day 8 part 3

    小猪的Android入门之路 Day 8 part 3 Android网络编程浅析--Android网络数据的下载 --转载请注明出处:coder-pig 本节引言: 我们的应用很多时候都会涉及到网络 ...

  6. 360buy android 首页打开网络监控数据分析

    360buy android 首页打开网络监控数据分析 一共10次链接,5次接口数据链接,5次图片... 主要分析接口数据链接 见附件html... 从下往上看... 五次接口tcp数据链接,七次请求 ...

  7. 小猪的Android入门之路——目录(持续更新)

    小猪的Android入门之路专栏目录                     --转载请注明:coder-pig 欢迎转载,请乎用于商业用途! 写本专栏的一些感慨:      小猪的Android入门 ...

  8. 云计算网络极速入门-虚拟机网络

    云计算网络极速入门-虚拟机网络 本文是<云计算网络极速入门>三部曲: <云计算网络极速入门-虚拟机网络> <云计算网络极速入门-容器网络> <云计算网络极速入 ...

  9. Android中的网络编程-黄俊东-专题视频课程

    Android中的网络编程-1902人已学习 课程介绍         剔除繁杂的理论,注重实践,深入浅出讲解Android中的网络编程 课程收益     每一个学员都能系统地掌握Android中的网 ...

最新文章

  1. easyuI企业管理系统-实战三 添加功能
  2. python爬虫天气预报难不难_python爬虫可以用来看天气预报吗?
  3. go结构体初始化_golang中结构体的初始化方法
  4. python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)
  5. 批量生成zabbix screen xml file
  6. LeetCode-两数之和(Java) 记录下刷题的第一天以及近期迷茫感受
  7. 运行java SWT例子
  8. 科学计算机的平均数在哪,平均数
  9. 20220418 如何下载网页pdf(没有下载按钮的情况,不是打印网页)
  10. 上twitter_如何在Twitter上对某人静音
  11. centos7安装boost记录
  12. matlab径向基网络,MATLAB——径向基网络拟合曲线和分类
  13. 安装 Ruby On Rails on Windows
  14. JS模块化(一):Commonjs
  15. 系统设计时先画用例图还是流程图
  16. java毕业设计电子书店管理系统Mybatis+系统+数据库+调试部署
  17. JavaScript之ECMAScript-正则表达式
  18. 郑重推荐使用WPS 2010
  19. uc浏览器下载的视频php格式,如何将UC缓存的视频转化为通用的MP4格式?将缓存的视频转化为MP4格式的方法...
  20. 美联储降息如何影响加密货币市场?| 一周问答热议

热门文章

  1. java中除了跟数据相关的知识_Java的基本数据类型及知识介绍
  2. java文件上传maven_ssm+maven框架搭建实现ajax多文件上传功能
  3. 如何命令行远程连接centos_如何使用windows远程控制centOS桌面
  4. python 可视化监控平台_python可视化篇之流式数据监控的实现
  5. java高级mysql面试题_Java高级面试题
  6. 搭建你的嵌入式Vxworks开发环境
  7. linux实验三makefile,实验平台上Makefile详细的解释
  8. 单选按钮_PerlTk教程之按钮Button、复选按钮Checkbutton、单选按钮Radiobutton(附完整代码)...
  9. 【转】刨根究底字符编码之三——字符编码的由来
  10. Html控件和Web控件(转)