【超越梦想】Android+Servlet搭建自己的app(3-2)——Android端登录实现

在上一篇中我们获取到了数据,即用户名和密码。接下来我们要将数据发送到写好的服务器端进行解析。在这里就要进行网络访问了。需要添加一个权限。
在AndroidManifest.xml文件中添加上这一行代码

<uses-permission android:name="android.permission.INTERNET"/>

首先要明确的一点是在Android中所有的耗时逻辑,都要在子线程中进项,这样的好处是不会造成程序的卡顿。其次就是要知道,所有的UI刷新都要在UI线程中进行。UI线程就是主线程。

在这里Android给出了一个集成好了的技术,用以耗时逻辑和UI更新,就是AsyncTask。具体用法在代码中讲解。
进行访问网络的方法有很多如HttpClient、HttpURLConnection 、OKhttp…

其中从 Android 6.0(API 23) 往后 Google把 HttpClient 给干掉了,为什么?说是因为它接口、方法太多,API太过复杂,升级维护难以在当前版本API上进行,这就会导致 Android 版本兼容上出现难以解决的问题,所以就把它干掉了。所以我们就使用HttpURLConnection 中的GET方式

在这里给大家一个工具类供大家使用。

话不多说,上代码

(一)工具类HttpUtil


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUtil {

    public static String doPost(URL url) {


        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try {
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(8000);
            connection.setReadTimeout(8000);
            InputStream in = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {

                response.append(line);
            }

            return response.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                connection.disconnect();
                ;
            }
        }
        return null;
    }
}

(二)MainActivity

package com.example.hp.myapplication;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    EditText username;
    EditText password;
    Button Login;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
        Login = (Button)findViewById(R.id.login);
        Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String Username = username.getText().toString();
                String Password = password.getText().toString();
                String url = "http://192.168.31.220:8080/test/LoginServlet?username="+Username+"&password="+Password;
                new LoginTask().execute(url);
                 }
        });
    }

    class  LoginTask extends AsyncTask<String,Integer,String> {
        @Override
        protected String doInBackground(String... params) {
            String par  = params[0];
            URL url = null;
            try {
                url = new URL(par);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            String result = HttpUtil.doPost(url);
            return result;
        }
        //第四步
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            //保存数据
            if(result.equals("1")){
                Toast.makeText(getApplicationContext(),"登陆成功",Toast.LENGTH_SHORT).show();
                return;
            }else{
                if(result.equals("-1")){
                    Toast.makeText(getApplicationContext(),"登陆失败",Toast.LENGTH_SHORT).show();
                    return;
                }
            }

        }
    }
}

这时候需要注意的是我们需要手机和服务器在同一局域网中。

运行结果如下
这里写图片描述

第一个工具类HttpUtil 有一个方法doPost,需要传进一个URL类型的参数,就目前的功能来说就是连接LoginServlet的链接。我们将用户名和密码用参数传入url。就实现了用户名和密码的获取。然后doPost的具体细节就不再讲述。简单地说就是传入参数,然后将从服务器的值返回。

在MainActivity中我们添加了一个内部类LoginTask它继承了AsyncTask。其中doInBackground方法的参数是一个数组,doInBackground的返回值作为onPostExecute方法的参数传入。在onPostExecute中就可以进行UI更新了。当然登陆不用UI刷新。

让我们具体的看一下代码。将一个String类型的url传入,然后再doInBackground方法中转化为了URL类型,再调用 HttpUtil类的doPost方法。将url传入。得到的返回值就是从服务器中得到的数据。在之前的博客中我们知道如果用户名密码都是正确那么就返回一个1,否则返回一个-1。将返回值传入onPostExecute方法,如果返回值为1则…如果返回值为-1则…

到这里我们就实现了用户的登陆。具体的代码都在上边贴出来了。还有疑问的地方可以留言。如有写错的地方希望大佬批评指正。

【超越梦想】Android+Servlet搭建自己的app(4-1)——Android端注册实现

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值