*注:进行网络编程一定要给权限——
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
一、HttpURLConnection的基本使用
1、GET方式:
String path = "http://localhost:8080/web/userLogin?username="
+URLEncoder.encode("zhangsan")
+"&password="+URLEncoder.encode("123");//注意对数据进行编码
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");//设置请求方式
conn.setConnectTimeout(5000);//设置超时时间(必要)
int responseCode = conn.getResponseCode();//获得响应状态码
if(responseCode == 200){//相应成功
InputStream is = conn.getInputStream();//获得输入流,得到返回内容
…………
}
2、POST方式:
URL url = new URL("http://localhost:8080/web/userLogin");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5000);
//准备数据
String data = "username="+URLEncoder.encode("zhangsan")
+"&password="+URLEncoder.encode("123");
//设置数据提交方式(这里是以表单形式)和长度
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length",data-length()+"");
//以流的形式将数据写到服务器
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(data.getBytes());
//获取响应状态码
int code = conn.getResponseCode();
if(code == 200){
InputStream is = conn.getInputStream();
………………
}
二、关于Handle消息机制
Handle可以发送消息和处理消息,发送的消息会放入MessageQueue消息队列,然后由Looper循环取出,交给handleMessage进行处理。
*注意:以上操作必须放在子线程里进行。就是说必须在new Thread 里边进行。(Android 4.0之后的要求)
三、使用HttpRULConnection和Handle消息处理机制,通过Url获取图片
1、编写一个简单的页面:
<?xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/web_url"
android:layout_width="0dp"
android:layout_weight="1.0"
android:hint="输入图片路径"
android:background="#EBEBEBEB"
android:layout_marginLeft="5dp"
android:layout_marginTop="3dp"
android:layout_height="match_parent" />
<Button
android:id="@+id/getImage"
android:text="搜索"
android:onClick="click"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView
android:id="@+id/web_Image"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
2、编写Activity部分(重点):
package cn.edu.sjzc;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private static final int ERROR_MSG = 2;
private EditText et;
private Button bt;
private ImageView iv;
private Bitmap bitmap;
private int CHANGE_UI = 1;
//在主线程的消息处理器
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == CHANGE_UI){
Bitmap bitmap = (Bitmap) msg.obj;//拿到消息内容
iv.setImageBitmap(bitmap);//设置图片
} else if (msg.what == ERROR_MSG) {
Toast.makeText(MainActivity.this,"获取失败",Toast.LENGTH_LONG).show();
}
}
};
private HttpURLConnection conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = findViewById(R.id.web_url);
bt = findViewById(R.id.getImage);
iv = findViewById(R.id.web_Image);
et.setText("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2039465551,868461273&fm=26&gp=0.jpg");//模拟输入图片地址
}
public void click(View view){
final String path = et.getText().toString();
if (TextUtils.isEmpty(path)){
Toast.makeText(MainActivity.this,"输入内容不能为空",Toast.LENGTH_LONG).show();
}
else {
//必须在子线程中进行网络请求
//开启子线程
new Thread(){
@Override
public void run() {
try {
URL url = new URL(path);
//打开连接
conn = (HttpURLConnection) url.openConnection();
//设置请求类型
conn.setRequestMethod("GET");
//设置超时时间
conn.setConnectTimeout(5000);
//获得响应码
int code = conn.getResponseCode();
if (code == 200){
//说明响应成功
//获得输入流
InputStream is = conn.getInputStream();
//将输入流转换成BitMap对象
bitmap = BitmapFactory.decodeStream(is);
//Handler必须在主线程里创建,不可以在子线程里创建!
//将更改界面的消息 发送给主线程
Message msg = new Message();
msg.what = CHANGE_UI;//用于判断消息
msg.obj = bitmap;//携带内容
handler.sendMessage(msg);//发送消息
}
} catch (Exception e) {
e.printStackTrace();
Message msg = new Message();
msg.what = ERROR_MSG;
handler.sendMessage(msg);
}
conn.disconnect();
}
}.start();
}
}
}
3、授予网络权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.edu.sjzc">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>