Android 的网络请求需要开辟子线程的原因 +程序实例
来源:互联网 发布:java传递参数基本类型 编辑:程序博客网 时间:2024/06/05 14:34
原因总结如下
1、为了避免导致UI卡顿的情况:比如在OnCreate 里面先进行网络请求然后还要加载布局 。
2、在Android4.0以后,在主线程中的HTTP请求,运行时都会报错 ANRs (“Application Not Responding”),”应用没有响应“。
所以:当进行网络请求的时候 还是需要开辟一个子线程,然后等到数据返回成功后再刷新UI
一个程序实例 如下 只有java 代码。
1、然后UI部分就是一个Button 和 一个TextView 外面套了一个ScollView , ,注意要申请网络连接的权限
2、最后使用runOnUiThread()方法刷新UI
package com.lfork.a98620.networktest;//import....public class MainActivity extends AppCompatActivity { TextView responseText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); responseText = (TextView) findViewById(R.id.response_text); Button sendRequest = (Button) findViewById(R.id.send_request); sendRequest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { sendRequestWithHttpURLConnection(); } }); } private void sendRequestWithHttpURLConnection() { //开启线程来发起网络请求 new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection; BufferedReader reader; try { URL url = new URL("https://www.baidu.com"); connection = (HttpURLConnection) url.openConnection(); //GET 表示获取数据 POST表示发送数据 connection.setRequestMethod("GET"); //设置连接超时的时间 connection.setConnectTimeout(8000); connection.setReadTimeout(8000); InputStream in = connection.getInputStream(); //下面对获取到的输入流进行读取 reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } showResponse(response.toString()); } catch (Exception e) { e.printStackTrace(); } } }).start(); } //android 时不允许在子线程里面更新UI的 我们需要通过这个方法 将线程切换到主线程,然后再更新UI元素 private void showResponse(final String response) { runOnUiThread(new Runnable() { @Override public void run() { responseText.setText(response); } }); } }
阅读全文
1 0
- Android 的网络请求需要开辟子线程的原因 +程序实例
- Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)
- 开辟子线程
- 直接NEW线程请求简单网络数据的实例
- 网络请求需要的依赖
- kotlin 开发 android 程序中网络http请求和线程的使用
- 网络编程之TCP通信,为什么在Serve端为每个Client端开辟一个单独的线程来处理Client的请求
- Android中网络请求放在子线程中问题
- Volley的网络请求实例
- 开启服务器,自动加载类是否需要开辟新的线程研究
- iOS9网络请求错误的原因
- Android 基于线程池的网络请求框架
- android程序连接网络测试:连接失败的原因。
- 子线程也是需要休息的
- Android中开辟线程(下载-网络连接)
- Android网络请求实例
- android网络请求失败原因
- 三种开辟工作线程的方法
- [leetcode]483. Smallest Good Base
- 宏、函数、宏函数的区别
- Mysql中文模糊查询问题
- JS多物体透明度运动
- 经典WebView加载HTML布局示例
- Android 的网络请求需要开辟子线程的原因 +程序实例
- 括号配对问题
- 王学岗ToolBar,DrawLayout+Navigation的使用(二)
- 算法训练 字符串逆序
- 炮兵阵地 POJ
- 两两交换链表中的节点
- 全栈(FullStack)工程师指南
- emWin 2天速成实例教程003_Framewin和Window窗口控件和2D绘图
- C#多线程之二:ManualResetEvent和AutoResetEvent