客户端连接上服务器后,向服务器请求某个web资源,称之为向服务器发送了一个http请求,一个完整的http请求包括 “一个请求行,若干个消息头,以及内容”。
HttpUrlConnection:HttpUrlConnection是Java的标准指定网站发送GET请求、POST请求类,HttpUrlConnection继承URLConnection,可用于向指定网站发送GET请求、POST请求,HttpUrlConnection在使用上相对简单,并且已于扩展,推荐使用。
前提:1.在Android中访问网络必须添加好权限;
2.访问网络放在子线程中。
<uses-permission android:name="android.permission.INTERNET" />
//网络权限代码
设置好Activity的布局文件,在里面建立一个Button
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.practice.UrlActivity">
<Button
android:id="@+id/bt1"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击就送"
/>
LinearLayout>
定义好按钮,绑定ID,设置好按钮的监听
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_url);
BlindID();
}
private void BlindID() {
button=findViewById(R.id.bt1);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt1:
break;
}
}
在点击事件中创建子线程,创建 getWebInfo方法
new Thread(new Runnable() {
@Override
public void run() {
getWebInfo();
}
}).start();
在方法中使用HttpUrlConnection,创建URl获取网站源;
创建开关——通过URL对象调用openConnection()方法获得HttpURLConnection对象;
创建好传输数据流,使用BufferedReader获取数据。
定义变量值,判断数据是否在传输,当不在传输是Close,使用Log.e打印获得的stringBuffer.toString()。
private void getWebInfo() {
try {
//创建URL——找到网站源
URL url=new URL("https://hao.qq.com/?unc=Af31026&s=o400493_1");
//创建开关——HttpURLConnection
HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
//创建数据流——Inputstream
InputStream inputStream=httpURLConnection.getInputStream();
//创建存放库——InputStreamReader
InputStreamReader reader=new InputStreamReader(inputStream,"UTF-8");
//获取数据——BufferedReader
BufferedReader bufferedReader=new BufferedReader(reader);
//
StringBuffer stringBuffer=new StringBuffer();
String temp=null;
while ((temp=bufferedReader.readLine())!=null){
stringBuffer.append(temp);
}
bufferedReader.close();
reader.close();
inputStream.close();
Log.e("wang ",stringBuffer.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
创建Activity,完成xml布局,用ImageView存放要加载的图片。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.practice.PicActivity">
<Button
android:id="@+id/btn1"
android:layout_gravity="center"
android:text="加载图片"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
LinearLayout>
绑定ID和设置按钮监听;
Button showbutton;
ImageView webimageView;
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pic);
BlindID();
}
private void BlindID() {
showbutton=findViewById(R.id.btn1);
webimageView=findViewById(R.id.image);
showbutton.setOnClickListener(this);
}
创建内部类来继承AsyncTask,实现重写方法;
在子线程这创建URL,获取图片地址,发送获取请求,创建输入流并将图片数据流通过BitmapFactory解码成图片;
完成后在主线程中设置图片。
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(String... strings) {
try {
//创建URL 获取图片地址
URL url=new URL(strings[0]);
//发送请求
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//创建输入流
InputStream inputStream=connection.getInputStream();
//将图片数据流通过BitmapFactory解码成图片
bitmap= BitmapFactory.decodeStream(inputStream);
//
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return 1;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
switch (integer) {
case 1:
//设置Image View为图片
webimageView.setImageBitmap(bitmap);
break;
default:
break;
}
}