Android 使用登录案例+(提交和接收数据乱码问题) - 奇乐云's blog - 奇乐云的个人博客

会飞的鱼

奇乐云
首页 » Android » Android 使用登录案例+(提交和接收数据乱码问题)

Android 使用登录案例+(提交和接收数据乱码问题)

重点
(1):转换编码提交数据
String data = "user="+URLEncoder.encode(name,"utf-8")+"&pw="+URLEncoder.encode(pwd,"utf-8");

(2):转换接收数据编码
String content = new String(baos.toByteArray(),"utf-8");

示例代码:
[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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入 密码" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click1"
        android:text="get提交" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="click2"
        android:text="post提交" />
</LinearLayout>

[2]主代码文件附(提交数据设置字符编码)
package com.example.a15411.login;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class MainActivity extends AppCompatActivity {

    private EditText et_password;
    private EditText et_username;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_username = (EditText)findViewById(R.id.et_username);
        et_password = (EditText)findViewById(R.id.et_password);
    }

    //[1]点击按 进行get方式提交数据
    public void click1(View v){
        new Thread(){public void run() {
                try {
                    Log.v("msgg","aaaa");
                    //[2]获取账号密码
                    String name = et_username.getText().toString().trim();
                    String pwd = et_password.getText().toString().trim();
                    //[2.1]定义一个get方式要提交的路径 小细节如果提交的是中文 需要对参数进行urlencode 编码
                    String path = "http://jk.qileyun.cn/denglu/api.php?username="+URLEncoder.encode(name,"utf-8")+"&password="+URLEncoder.encode(pwd,"utf-8")+"&submit=+%E7%A1%AE+%E5%AE%9A+";
                    //[2.2]
                    //(1)创建一个url对象 参数计算网址
                    URL url = new URL(path);
                    //(2)获取httpUrlConnection 链接对象
                    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                    //(3)设置参数 发送get请求
                    conn.setRequestMethod("GET");
                    //(4)设置链接网络的超时时间
                    conn.setConnectTimeout(5000);
                    //(5)获取服务器返回的状态码
                    int code = conn.getResponseCode();
                    if(code==200){
                        //(6)获取服务器返回的数据 以流的形式返回
                        InputStream inputStream = conn.getInputStream();
                        //(6.1)把inputstream 转换成String
                        String readStream = StreamTools.readStream(inputStream);
                        //(8)把服务器的返回的数据展示到Toast上 不能在子线程展示Toast
                        showToast(readStream);
                    }else{

                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            };}.start();

    }

    //[1]点击按 进行post方式提交数据
    public void click2(View v){
        new Thread(){public void run() {
            try {
                //[2]获取账号密码
                String name = et_username.getText().toString().trim();
                String pwd = et_password.getText().toString().trim();
                String data = "user="+URLEncoder.encode(name,"utf-8")+"&pw="+URLEncoder.encode(pwd,"utf-8");
                //[2.1]定义一个get方式要提交的路径
                String path = "http://blog.qileyun.cn/content/templates/FYS/inc/ajax.php?a=login";
                //[2.2]
                //(1)创建一个url对象 参数计算网址
                URL url = new URL(path);
                //(2)获取httpUrlConnection 链接对象
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                //(3)设置参数 发送get请求
                conn.setRequestMethod("POST");
                //(3.1)设置2给全球通信息
                conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
                conn.setRequestProperty("Content-Length",data.length()+"");
                //(3.2)把我们主拼的数据提交
                conn.setDoOutput(true);//设置一个标记 允许输出
                conn.getOutputStream().write(data.getBytes());//以流的形式传输
                //(4)设置链接网络的超时时间
                conn.setConnectTimeout(5000);
                //(5)获取服务器返回的状态码
                int code = conn.getResponseCode();
                if(code==200){
                    //(6)获取服务器返回的数据 以流的形式返回
                    InputStream inputStream = conn.getInputStream();
                    //(6.1)把inputstream 转换成String
                    String readStream = StreamTools.readStream(inputStream);
                    //(8)把服务器的返回的数据展示到Toast上 不能在子线程展示Toast
                    showToast(readStream);
                }else{

                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        };}.start();
    }


    //封装toast方法 该toast方法会执行在主线程上
    public void showToast(final String content){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //该方法一定执行主线程
                Toast.makeText(getApplicationContext(),content,Toast.LENGTH_LONG).show();
            }
        });
    }
}

[3]流转换字符串文件 附(转换接收的数据编码格式)
package com.example.a15411.login;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class  StreamTools {
    //把一个inputStream 转换成一个String
    public static String readStream(InputStream in) throws Exception{

        //定义一个内存输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int len = -1;
        byte[] buffer = new byte[1024]; //1kb
        while((len=in.read(buffer))!=-1){

            baos.write(buffer, 0, len);
        }
        in.close();
        //以什么编码转换流
        String content = new String(baos.toByteArray(),"utf-8");

        return content;

    }
}

[5]效果图
device-2018-12-16-013324.png

文章如无特别注明均为原创! 作者: 奇乐云, 转载或复制请以 超链接形式 并注明出处 奇乐云's blog - 奇乐云的个人博客
原文地址《 Android 使用登录案例+(提交和接收数据乱码问题)》发布于2018-12-15

分享到:
打赏

评论

游客

切换注册

登录

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册