【Android】HttpURLConnection在子线程请求、在主线程处理数据 您所在的位置:网站首页 webview交互与安卓主线程 【Android】HttpURLConnection在子线程请求、在主线程处理数据

【Android】HttpURLConnection在子线程请求、在主线程处理数据

2023-09-13 01:27| 来源: 网络整理| 查看: 265

HttpURLConnection可以发起网络请求,比如说我们需要从服务器获取数据

一、layout布局

方便起见,就放一个button就行了

activity_main.xml

二、Java代码

MainActivity.java

public class MainActivity extends AppCompatActivity { private Button btn_send; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_send = findViewById(R.id.btn_send); btn_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startHttpURLConnection(); } }); } private void startHttpURLConnection(){ //耗时操作必须要放在子线程 new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; BufferedReader reader = null; try{ URL url = new URL("https://www.baidu.com"); connection = (HttpURLConnection) url.openConnection();//打开openConnection链接 connection.setRequestMethod("GET");//以GET方式发起请求(默认) /*//若是以POST方式提交数据 connection.setRequestMethod("POST"); DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes("usename=name&password=111111");//提交的数据用&分割 */ connection.setConnectTimeout(5000);//设置请求超时时间为5秒 connection.setReadTimeout(5000);//设置读取超时时间为5秒 InputStream inputStream = connection.getInputStream();//获得数据流 reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null){ response.append(line); } dealWithResult(response.toString());//新建一个方法处理请求得到的数据 }catch (Exception e){e.printStackTrace();} finally { if (reader != null){ try{reader.close();}catch (Exception e){e.printStackTrace();} } if(connection != null){ connection.disconnect(); } } } }).start(); } private void dealWithResult(final String res){ } } 三、更新UI线程

方法一:

private void dealWithResult(final String res){ //在UI主线程操作,比如说用TextView显示 runOnUiThread(new Runnable() { @Override public void run() { Log.e("res", "dealWithResult: "+res); } }); }

方法二:

private void dealWithResult(final String res){ //在UI主线程操作,比如说用TextView显示 new Handler(getApplicationContext().getMainLooper()).post(new Runnable() { @Override public void run() { Log.e("res", "run: "+res ); } }); } 四、添加网络权限

在Androidmanifest中使用权限

若是Android 9或以上,还需要在application标签中加入

android:usesCleartextTraffic="true"


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有