Android 客户端与服务器端进行数据交互(二登录客户端)

Posted Codingma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 客户端与服务器端进行数据交互(二登录客户端)相关的知识,希望对你有一定的参考价值。

概要

android客户端分为User,HttpUtil,HttpCallbackListener,MainActivity四个部分。User model与服务端的一样,一方面是用于本地用户信息的存储model,另一方面也是为了保证构造URL时使用的key一致。
HttpUtil封装了发送Http请求的过程和构造URL的函数,HttpCallbackListener是用于发送请求后的回调接口,MainActivity就是用于测试的Activity交互界面了。

User model

不再贴出,见上一篇 Android 客户端与服务器端进行数据交互(一、安卓客户端)

HttpCallbackListener

回调接口定义了两个函数,一个是正常结束时回调的onFinish,一个是出现异常时的onError

//请求回调接口
public interface HttpCallbackListener 

    void onFinish(String response);

    void onError(Exception e);

HttpUtil

HttpUtil是一个进行了二次封装的Http工具类,包括了发送http请求的sendHttpRequest函数,组装URL的getURLWithParams函数和网络状态检查函数。
组装后的URL大概的样子就像这样”http://www.baidu.com?username=codingma&password=123456

public class HttpUtil 
    //封装的发送请求函数
    public static void sendHttpRequest(final String address, final HttpCallbackListener listener) 
        if (!HttpUtil.isNetworkAvailable())
            //这里写相应的网络设置处理
            return;
        
        new Thread(new Runnable() 
            @Override
            public void run() 
                HttpURLConnection connection = null;
                try
                    URL url = new URL(address);
                    //使用HttpURLConnection
                    connection = (HttpURLConnection) url.openConnection();
                    //设置方法和参数
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    //获取返回结果
                    InputStream inputStream = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null)
                        response.append(line);
                    
                    //成功则回调onFinish
                    if (listener != null)
                        listener.onFinish(response.toString());
                    
                 catch (Exception e) 
                    e.printStackTrace();
                    //出现异常则回调onError
                    if (listener != null)
                        listener.onError(e);
                    
                finally 
                    if (connection != null)
                        connection.disconnect();
                    
                
            
        ).start();
    

    //组装出带参数的完整URL
    public static String getURLWithParams(String address,HashMap<String,String> params) throws UnsupportedEncodingException 
        //设置编码
        final String encode = "UTF-8";
        StringBuilder url = new StringBuilder(address);
        url.append("?");
        //将map中的key,value构造进入URL中
        for(Map.Entry<String, String> entry:params.entrySet())
        
            url.append(entry.getKey()).append("=");
            url.append(URLEncoder.encode(entry.getValue(), encode));
            url.append("&");
        
        //删掉最后一个&
        url.deleteCharAt(url.length() - 1);
        return url.toString();
    

    //判断当前网络是否可用
    public static boolean isNetworkAvailable()
        //这里检查网络,后续再添加
        return true;
    

主活动

MainActivity就是最简单的测试UI界面,包括了两个输入框和一个按钮。
布局效果图如下

布局xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center_horizontal|center_vertical"
              android:orientation="vertical"
              android:paddingBottom="@dimen/activity_vertical_margin"
              android:paddingLeft="@dimen/activity_horizontal_margin"
              android:paddingRight="@dimen/activity_horizontal_margin"
              android:paddingTop="@dimen/activity_vertical_margin"
              tools:context="com.pku.codingma.zhisms.ui.loginAndRegister.LoginActivityFragment"
              tools:showIn="@layout/activity_main">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="手机号:"
            android:inputType="phone"
            android:layout_weight="1"/>

        <EditText
            android:id="@+id/phoneNumberEditText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="5"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="密码:"
            android:layout_weight="1"/>

        <EditText
            android:id="@+id/passwordEditText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:layout_weight="5"/>

    </LinearLayout>

    <Button
        android:id="@+id/loginButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:background="@color/colorPrimaryDark"
        android:text="login"/>

</LinearLayout>

MainActivity

MainActivity首先将输入框中的用户名和密码取出,构造HashMap。再将其传入HttpUtil.getURLWithParams函数中,构造出完整的URL,然后使用HttpUtil.sendHttpRequest发送请求,同时定义好回调接口要做的事情(即发出一条Message消息)。最后通过Handler和Message消息机制,根据请求返回结果做出对应的处理。

public class MainActivity extends AppCompatActivity implements View.OnClickListener
    private EditText mPhoneNumberEditText;
    private EditText mPassWordEditText;
    private Button mLoginButton;
    //用于接收Http请求的servlet的URL地址,请自己定义
    private String originAddress = "http://localhost:8080/Server/servlet/LoginServlet";
    //用于处理消息的Handler
    Handler mHandler = new Handler()
        @Override
        public void handleMessage(Message msg) 
            super.handleMessage(msg);
            String result = "";

            if ("OK".equals(msg.obj.toString()))
                result = "success";
            else if ("Wrong".equals(msg.obj.toString()))
                result = "fail";
            else 
                result = msg.obj.toString();
            
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
        
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
    

    private void initView() 
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mPhoneNumberEditText = (EditText) findViewById(R.id.phoneNumberEditText);
        mPassWordEditText = (EditText) findViewById(R.id.passwordEditText);
        mLoginButton = (Button) findViewById(R.id.loginButton);
    

    private void initEvent() 
        mLoginButton.setOnClickListener(this);
    

    public void login() 
        //检查用户输入的账号和密码的合法性
        if (!isInputValid())
            return;
        
        //构造HashMap
        HashMap<String, String> params = new HashMap<String, String>();
        params.put(User.PHONENUMBER, mPhoneNumberEditText.getText().toString());
        params.put(User.PASSWORD, mPassWordEditText.getText().toString());
        try 
            //构造完整URL
            String compeletedURL = HttpUtil.getURLWithParams(originAddress, params);
            //发送请求
            HttpUtil.sendHttpRequest(compeletedURL, new HttpCallbackListener() 
                @Override
                public void onFinish(String response) 
                    Message message = new Message();
                    message.obj = response;
                    mHandler.sendMessage(message);
                

                @Override
                public void onError(Exception e) 
                    Message message = new Message();
                    message.obj = e.toString();
                    mHandler.sendMessage(message);
                
            );
         catch (Exception e) 
            e.printStackTrace();
        
    

    private boolean isInputValid() 
        //检查用户输入的合法性,这里暂且默认用户输入合法
        return true;
    

    @Override
    public void onClick(View v) 
        switch (v.getId())
            case R.id.loginButton:
                login();
                break;
        
    

总结

Android端的稍微复杂一些,涉及Http请求发送,回调接口,一些有效性检查,Handler消息机制等等。不过都是最基础的使用级别,应该不难理解。

希望这篇文章对新手有所帮助,同时我自己在写的过程中也有了更深的体会。
转载请注明出处http://blog.csdn.net/u012145166/article/details/51334688
下载源码,请猛戳这里

以上是关于Android 客户端与服务器端进行数据交互(二登录客户端)的主要内容,如果未能解决你的问题,请参考以下文章

Android 客户端与服务器端进行数据交互(一登录服务器端)

Android 客户端与服务器端进行数据交互(二登录客户端)

Android 客户端与服务器端进行数据交互(二登录客户端)

Android 使用JSON格式与服务器交互 中文乱码问题解决

android客户端和服务器端怎么交互

第八章 网络的时代—网络开发