Android Studio中HTTP的请求
1.HttpUrlConnection
1,什么是Http请求?
- HTTP请求是客户端和服务器端之间,发送请求和返回应答的
标准( TCP)。 - 客户端发出一个HTTP请求后,就与服务器建立起了TCP连接,
服务端接收到请求并进行处理后返回给客户端响应数据。
2,什么是HttpUrlConnection?
- HttpURLConnection是java的标准指定网站发送GET请求、POST请求类,
- HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求,
- HttpURLConnction在使用上相对简单,并且易于扩展,推荐使用.(还有HttpClient不过很少有人用了)
3,如何使用HttpUrlConnection?
1.创建URL对象
2.通过URL对象调用openConnection()方法获得HttpURLConnection对象
3.HttpURLConnection对象设置其他连接属性
4.HttpURLConnection对象调用getInputStream()方法向服务器发送http请求
并获取到服务器返回的输入流
5.读取输入流,转换成String字符串
4,使用HttpUrlConnection获取Http请求(以访问百度网站为例)
package com.example.abc.myapplication;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;public class Main2Activity extends AppCompatActivity {private Button btn;//点击按钮访问@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);btn = findViewById(R.id.main2_btn);//绑定IDbtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//监听按钮new Thread(new Runnable() {//创建子线程@Overridepublic void run() {getwebinfo();//把路径选到MainActivity中}}).start();//启动子线程}});}private void getwebinfo() {try {//1,找水源--创建URLURL url = new URL("https://www.baidu.com/");//放网站//2,开水闸--openConnectionHttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();//3,建管道--InputStreamInputStream inputStream = httpURLConnection.getInputStream();//4,建蓄水池蓄水-InputStreamReaderInputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");//5,水桶盛水--BufferedReaderBufferedReader bufferedReader = new BufferedReader(reader);StringBuffer buffer = new StringBuffer();String temp = null;while ((temp = bufferedReader.readLine()) != null) {//取水--如果不为空就一直取buffer.append(temp);}bufferedReader.close();//记得关闭reader.close();inputStream.close();Log.e("MAIN",buffer.toString());//打印结果} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
在打印的结果中看到类似这种出现网页代码的基本上就已经访问到了。
2. 使用HttpUrlConnection加载图片
Activity展示:
package com.example.abc.app3131;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;public class ImgActivity extends AppCompatActivity {private Button btn;private ImageView im;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_img);im=findViewById(R.id.img_iv);btn=findViewById(R.id.img_btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ImgLoadTask imgLoadTask=new ImgLoadTask(im,btn);imgLoadTask.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg");//启动}});}
}
ImgLoadTask 展示:
package com.example.abc.app3131;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.Button;
import android.widget.ImageView;import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;/*** Created by Administrator on 2018/3/13.*/public class ImgLoadTask extends AsyncTask<String,Integer,Bitmap>{private ImageView imageView;private Button btn;public ImgLoadTask(ImageView im, Button btn) {this.imageView=im;this.btn=btn;}@Overrideprotected void onPreExecute() {super.onPreExecute();btn.setEnabled(false);btn.setText("加载完成");}@Overrideprotected Bitmap doInBackground(String... strings) {Bitmap bm=null;try {URL url=new URL(strings[0]);//创建URL对象HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();//使用openConnection获取HttpURLConnection对象InputStream inputStream=httpURLConnection.getInputStream();//输入流inputStreambm= BitmapFactory.decodeStream(inputStream);//图片} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bm;}@Overrideprotected void onPostExecute(Bitmap bitmap) {super.onPostExecute(bitmap);imageView.setImageBitmap(bitmap);//把结果图片放到控件上}
}
加载效果展示:
3. 使用HttpUrlConnection下载图片
要求:按键点击下载并显示图片
思路:
下载需要权限先将权限设置好。
按键点击下载并显示图片。
图片下载的图片网上路径。
下载下来需要放在本地文件中
创建图片所需要文件目录。
创建文件所需要的文件路径。
判断文件目录是否存在,没有创建。
判断文件是否存在,没有创建,有则返回结束。
文件不存在用URl查找。
判断返回值是否是200,错误返回返回值。
创建缓存区将文件下载到文件路径中。
显示图片
下载图片需要网络权限,读取权限和写入权限。
<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>`
将包导入到Gradle Scripts中的build.gradle中的对应app放到dependencies方法 中
compile 'com.master.android:permissionhelper:1.4'
MainActivity展示:
有PermissionHelper 的地方就是权限所需的条件
package com.example.abc.app3141;import android.Manifest;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;import com.master.permissionhelper.PermissionHelper;public class MainActivity extends AppCompatActivity {private Button btn;private ImageView img;private PermissionHelper permissionHelper;private String filename = "http://img03.sogoucdn.com/app/a/100520093/e18d20c94006dfe0-9eef65073f0f6be0-893885322f6eaef864e687f1df8bc129.jpg";//图片路径@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindID();//绑定IDpermissionHelper = new PermissionHelper(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);permissionHelper.request(new PermissionHelper.PermissionCallback() {@Overridepublic void onPermissionGranted() {btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//赋予权限可以上网,和使用本地DownloadTask task=new DownloadTask(MainActivity.this, btn, img);//新建//(上下文,按钮,图片)task.execute(filename, "5n1.jpg");//启动//(网上路径,下载到本地时的图片名称)}});}@Overridepublic void onIndividualPermissionGranted(String[] grantedPermission) {}@Overridepublic void onPermissionDenied() {}@Overridepublic void onPermissionDeniedBySystem() {}});}private void bindID() {btn = findViewById(R.id.main_btn);img = findViewById(R.id.main_img);}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (permissionHelper != null) {permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);}}
}
DownloadTask展示:
package com.example.abc.app3141;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;/*** Created by Administrator on 2018/3/14.*/public class DownloadTask extends AsyncTask<String, Integer, Integer> {private String dirpath;//下载文件的目录 例如:c/wenjian 具体到文件所在地private String filepath;//文件存储的具体路径 例如:c/wenjian/123.jpg 具体到文件到在哪private Context context;//上下文环境private Button btn;private ImageView img;public DownloadTask(Context context, Button btn, ImageView img) {//构造方法this.context = context;this.btn = btn;this.img = img;}@Overrideprotected Integer doInBackground(String... strings) {String filename = strings[1];//将MainActivity中的第二个文件名赋给filenamedirpath = Environment.getExternalStorageDirectory() + "/download_picture/";//把外部环境+要开创的新的路径赋给dirpathFile dir = new File(dirpath);//创建一个新 File 实例。if (!dir.exists()) {//判断dir是否存在//不存在就创建空目录dir.mkdir();}filepath = dirpath + filename;//filepath是详细地址=文件路径+文件名(filename=string【1】)File file = new File(filepath);//创建一个新 File 实例。if (!file.exists()) {//判断文件是否存在try {file.createNewFile();//不存在创建新文件} catch (IOException e) {e.printStackTrace();}} else {return -1;//不存在则返回返回值(-1=文件已存在)}InputStream inputStream = null;//定义一个InputStream变量 ,输入流OutputStream outputStream = null;//定义一个InputStream变量 ,输出流/*下载图片时--输入流是网络,输出流是本地*//*上传图片时--输出流是网络,输入流是本地*/try {URL url = new URL(strings[0]);//创建URL对象HttpURLConnection connection = (HttpURLConnection) url.openConnection();//用openConnection获取HttpURLConnection对象if (connection.getResponseCode() == 200) {//判断返回值是否为200(200为正常值,404为客户端错误,505为服务器错误)inputStream = connection.getInputStream();} else {return -2;//错误则返回返回值(-2=网络错误)}outputStream = new FileOutputStream(file);//输出流到本地int length = 0;//下载总量byte[] buffer = new byte[4 * 1024];//缓存区(4*1204=4k)while ((length = inputStream.read(buffer)) != -1) {//下载一直持续到最后一波正好结束再返回时发现没东西时结束(或者有空余)。outputStream.write(buffer, 0, length);//输入流写缓存区内容,从0到总长度}inputStream.close();//关闭输入流outputStream.close();//关闭输出流} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return 1;//返回值设为1(1=下载完成)}@Overrideprotected void onPostExecute(Integer integer) {super.onPostExecute(integer);switch (integer) {//使用switch语句对几个不同的返回值做回应case 1://(1=下载完成)Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();//把状态都Toast出来Bitmap bitmap = BitmapFactory.decodeFile(filepath);//将filepath(图片详细路径)从本地图库调用出来img.setImageBitmap(bitmap);//把值赋给控件//下载完成显示图片break;case -1://(-1=文件已存在)Toast.makeText(context, "文件已存在", Toast.LENGTH_SHORT).show();Bitmap bm = BitmapFactory.decodeFile(filepath);img.setImageBitmap(bm);break;case -2://(-2=网络错误)Toast.makeText(context, "网络连接失败", Toast.LENGTH_SHORT).show();break;}}
}
下载效果展示:
Android Studio中HTTP的请求相关推荐
- 在android studio中如何创建一个类来继承另外一个类_在Android使用Transition API检测用户活动...
在当今世界,移动设备是我们日常生活中必不可少的一部分,我们在走路.跑步.开车以及其他许多活动时都会使用移动设备. 了解用户拿着手机的时候在做什么,可以让你的应用程序根据用户的动作进行直观的调整.对于某 ...
- linux gradle仓库位置,如何在Android Studio中使用Gradle发布项目至Jcenter仓库
简述 目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布. Library的转换和引用 博主的 ...
- Android Studio 中列表视图(ListView)的应用
目录 引言 一.列表视图的作用 二.列表视图的工作原理和工作方式 三.准备数据源 四.适配器的使用 五.布局文件中的列表视图 六.自定义列表项布局 七.列表项点击事件处理 八.列表的优化 十.示例代码 ...
- android+assets+在哪,我在哪里将’assets’文件夹放在Android Studio中?
我对assets文件夹感到困惑. 它不是在Android Studio中自动创建的,几乎所有论坛都讨论了Eclipse. 如何在Android Studio中配置Assets目录? 由于Android ...
- android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...
在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...
- 导入eclipse工程到Android Studio中
ref: 从 Eclipse 迁移至 Android Studio | Android Studio https://developer.android.com/studio/intro/migrat ...
- 获取Android studio 中的模拟器的界面的点的坐标(Ubuntu)
实现的方法是使用Android studio 中的hierarchyviewer 来获取. 启动模拟器 emulator 打开命令行的终端 输入 hierarchyviewer 点击 inspect ...
- android studio数据库存储数据,如何使用API 23在android studio中的数据库中存储数据?...
大多数时候我不会发布任何内容,因为我可以在其他帖子中找到我需要的所有内容,但是现在我已经有几天了,您如何在数据库中存储任何内容?这是我的Java代码如何使用API 23在android studi ...
- Android如何使用so文件和Android studio中导入so
Android中使用so文件: 做一个PDF阅读的功能,找到一个开源的库,mupdf.下载的是网上编译好的so库,导入到自己项目中的时候一直报错Java.lang.UnsatisfiedLinkErr ...
- android studio中如何设置注释模板
在开发程序的时候,我们一般都会给文件自动添加上一些关于文件的注释信息,比如开发者的名字,开发的时间,开发者的联系方式等等.那么在android studio中该如何设置呢? 工具/原料 android ...
最新文章
- HTML基础知识个人总结
- 最后一个社团换届的感谢和感悟
- Nacos源码发送心跳
- 美团flutter_ggtalk 聊聊跨平台:后起之秀 Flutter
- Github入门学习
- 解决python中出现IndentationError:unindent does not match any outer indentation level错误
- matlab2c使用c++实现matlab函数系列教程-blkdiag函数
- Web开发编程语言是最适合新手的吗-开课吧
- csv文件的常用方法--持续更新
- 每周学习总结11月9日
- 学习Python必备的8本书
- vue引入TweenMax.js
- 在Ubuntu18.04上编译SWASH模型
- 【不支持全功能typec的电脑如何一线直连便携屏】
- android中JNI知识(很全)
- Android 使用 Ant 批量打包
- 关于linux开机出现initramfs的解决
- oca考试及ocp考试指南
- 市场营销学1——入门
- 使用IDEA 的DBMS 链接达梦数据库