网络编程(part1)

*注:进行网络编程一定要给权限——

<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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值