Android Java Web实现登录注册(一)——客户端

首先要搭建好Java Web开发环境,详细的方法请看另一篇博文点击打开链接


效果:

Android Java Web实现登录注册(一)——客户端_第1张图片


一、布局

布局如上图,为了控制篇幅就省略了,共用两个layout的.xml文件


二、Activity

import包的部分省略了

代码:LoginActivity.java

public class LoginActivity extends AppCompatActivity {

    EditText id, password;
    Button loginBtn, registerBtn;
    Handler handler;
    static int LOGIN_FAILED = 0;
    static int LOGIN_SUCCEEDED = 1;
    Dialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        id = (EditText)findViewById(R.id.id);
        password = (EditText)findViewById(R.id.password);
        loginBtn = (Button)findViewById(R.id.loginBtn);
        registerBtn = (Button)findViewById(R.id.registerBtn);

        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v){
                if(isConnectingToInternet()){ //检查网络
                    if (id.getText().toString().equals(""))
                        Toast.makeText(LoginActivity.this, "请输入账号", Toast.LENGTH_SHORT).show();
                    else {
                        //启动登录Thread
                        dialog = new Dialog(LoginActivity.this);
                        dialog.setTitle("正在登录,请稍后...");
                        dialog.setCancelable(false);
                        dialog.show();
                        new LoginPostThread(id.getText().toString(),
                                password.getText().toString()).start();
                    }
                }else{
                    Toast.makeText(getApplicationContext(),
                            "网络未连接",Toast.LENGTH_SHORT).show();
                }
            }
        });

        registerBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //跳转到注册Activity
                Intent intent = new Intent(LoginActivity.this,
                        RegisterActivity.class);
                startActivity(intent);
            }
        });

        //Handle,Msg返回成功信息,跳转到其他Activity
        handler = new Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                dialog.dismiss();
                if (msg.what == 111) {  // 处理发送线程传回的消息
                    if(msg.obj.toString().equals("SUCCEEDED")){
                        //跳转
                        Toast.makeText(LoginActivity.this, "模拟跳转", Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(LoginActivity.this, "账号和密码不匹配", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        };

    }

    //登录Thread调用LoginPostService,返回Msg
    public class LoginPostThread extends Thread {
        public String id, password;

        public LoginPostThread(String id, String password) {
            this.id = id;
            this.password = password;
        }

        @Override
        public void run() {
            // Sevice传回int
            int responseInt = 0;
            if(!id.equals("")) {
                // 要发送的数据
                List params = new ArrayList();
                params.add(new BasicNameValuePair("id", id));
                params.add(new BasicNameValuePair("password", password));
                // 发送数据,获取对象
                responseInt = LoginPostService.send(params);
                Log.i("tag", "LoginActivity: responseInt = " + responseInt);
                // 准备发送消息
                Message msg = handler.obtainMessage();
                // 设置消息默认值
                msg.what = 111;
                // 服务器返回信息的判断和处理
                if(responseInt == LOGIN_FAILED) {
                    msg.obj = "FAILED";
                }else if(responseInt == LOGIN_SUCCEEDED) {
                    msg.obj = "SUCCEEDED";
                }
                handler.sendMessage(msg);
            }
        }
    }

    // 检测网络状态
    public boolean isConnectingToInternet() {
        ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (int i = 0; i < info.length; i++)
                    if (info[i].getState() == NetworkInfo.State.CONNECTED)
                    {
                        return true;
                    }
        }
        return false;
    }
}

其中,NameValuePair、BasicNameValuePair两个类的使用,需要为项目引入包:org.apache.http.legacy.jar。下载地址点击打开链接

代码:RegisterActivity.java

public class RegisterActivity extends AppCompatActivity {

    EditText id, password;
    Button loginBtn;
    //Button returnBtn;
    EditText password2, username;
    Dialog dialog;
    Handler handler;
    static int LOGIN_FAILED = 0;
    static int LOGIN_SUCCEEDED = 1;
    static int REGISTER_FAILED = 2;
    static int REGISTER_SUCCEEDED = 3;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        id = (EditText)findViewById(R.id.id);
        password = (EditText)findViewById(R.id.password);
        password2 = (EditText)findViewById(R.id.password2);
        username = (EditText)findViewById(R.id.username);
        loginBtn = (Button)findViewById(R.id.loginBtn);
        //returnBtn = (Button)findViewById(R.id.returnBtn);

        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(checkEdit()){//检查注册信息
                    if(isConnectingToInternet()){ //检查网络
                        if (id.getText().toString().equals(""))
                            Toast.makeText(RegisterActivity.this, "请输入账号", Toast.LENGTH_SHORT).show();
                        else {
                            //启动登录Thread
                            dialog = new Dialog(RegisterActivity.this);
                            dialog.setTitle("正在注册,请稍后...");
                            dialog.setCancelable(false);
                            dialog.show();
                            new RegisterPostThread(id.getText().toString(),
                                    username.getText().toString(),
                                    password.getText().toString()).start();
                        }
                    }else{
                        Toast.makeText(getApplicationContext(),
                                "网络未连接",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });

        //Handle,Msg返回成功信息,跳转到其他Activity
        handler = new Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                dialog.dismiss();
                if (msg.what == 222) {  // 处理发送线程传回的消息
                    if(msg.obj.toString().equals("SUCCEEDED")){
                        Log.i("tag", "注册模拟跳转");
                        //跳转
                        Toast.makeText(RegisterActivity.this, "模拟跳转", Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(RegisterActivity.this, "账号已被注册,注册失败", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        };

        /*
        returnBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //回到登录Activity
                Intent intent = new Intent(RegisterActivity.this,
                        LoginActivity.class);
                startActivity(intent);
            }
        });*/
    }

    //注册Thread调用RegisterPostService,返回Msg
    public class RegisterPostThread extends Thread {
        public String id, username, password;

        public RegisterPostThread(String id, String username, String password) {
            this.id = id;
            this.username = username;
            this.password = password;
        }

        @Override
        public void run() {
            // Sevice传回int
            int responseInt = 0;
            if(!id.equals("")) {
                // 要发送的数据
                List params = new ArrayList();
                params.add(new BasicNameValuePair("id", id));
                params.add(new BasicNameValuePair("username", username));
                params.add(new BasicNameValuePair("password", password));
                // 发送数据,获取对象
                responseInt = RegisterPostService.send(params);
                Log.i("tag", "RegisterActivity: responseInt = " + responseInt);
                // 准备发送消息
                Message msg = handler.obtainMessage();
                // 设置消息默认值
                msg.what = 222;
                // 服务器返回信息的判断和处理
                if(responseInt == REGISTER_FAILED) {
                    msg.obj = "FAILED";
                }else if(responseInt == REGISTER_SUCCEEDED) {
                    msg.obj = "SUCCEEDED";
                }
                handler.sendMessage(msg);
            }
        }
    }

    //检查注册信息
    public boolean checkEdit(){
        if(id.getText().toString().equals("")){
            Toast.makeText(RegisterActivity.this, "账户不能为空", Toast.LENGTH_SHORT).show();
            return false;
        }
        if(password.getText().toString().equals("")){
            Toast.makeText(RegisterActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show();
            return false;
        }
        if(!password2.getText().toString().equals(password.getText().toString())){
            Toast.makeText(RegisterActivity.this, "两次输入的密码不同", Toast.LENGTH_SHORT).show();
            return false;
        }
        if(username.getText().toString().equals("")){
            Toast.makeText(RegisterActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }

    // 检测网络状态
    public boolean isConnectingToInternet() {
        ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (int i = 0; i < info.length; i++)
                    if (info[i].getState() == NetworkInfo.State.CONNECTED)
                    {
                        return true;
                    }
        }
        return false;
    }
}

记得在AndroidMainfest.xml中注册权限和Activity


三、PostService类

指定要连接的服务器端Servlet,(Post方法),传去数据并解析返回数据给Activity

代码:LoginPostService.java

public class LoginPostService {
    static int LOGIN_FAILED = 0;
    static int LOGIN_SUCCEEDED = 1;

    public static int send(List params) {
        // 返回值
        int responseInt = LOGIN_FAILED;
        // 定位服务器的Servlet
        String servlet = "LoginServlet";
        // 通过 POST 方式获取 HTTP 服务器数据
        String responseMsg;
        responseMsg = MyHttpPost.executeHttpPost(servlet, params);
        Log.i("tag", "LoginService: responseMsg = " + responseMsg);
        // 解析服务器数据,返回相应 Long 值
        if(responseMsg.equals("SUCCEEDED")) {
            responseInt = LOGIN_SUCCEEDED;
        }
        return responseInt;
    }
}
RegisterService.java和LoginPostService.java几乎是一样的,差别只在于定位的Servlet名字和几个变量名的不同,就不放出来了。


四、HttpPost类

前面的PostService类指定了连接的服务器端Servlet之后,把地址交给HttpPost类来真正连接服务器端并调用相应服务器端Servlet
代码:MyHttpPost.java

public class MyHttpPost {
    // 服务器地址
    private static String SERVER = "http://192.168.1.108:8080";
    // 项目地址
    private static String PROJECT = "/LYPlayerServer/";
    // 请求超时
    private static final int REQUEST_TIMEOUT = 0;
    // 读取超时
    private static final int SO_TIMEOUT = 0;

    // 通过 POST 方式获取HTTP服务器数据
    public static String executeHttpPost(String servlet, List params) {
        String baseURL = SERVER + PROJECT + servlet;
        String responseMsg = "FAILED";
        try {
            //连接到服务器端相应的Servlet
            HttpPost request = new HttpPost(baseURL);
            request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            BasicHttpParams httpParams = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParams, REQUEST_TIMEOUT);
            HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
            HttpClient client = new DefaultHttpClient(httpParams);
            HttpResponse response = client.execute(request);
            if(response.getStatusLine().getStatusCode()==200)//是否成功收取信息
                responseMsg = EntityUtils.toString(response.getEntity());
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("tag", "RegisterHttpPost: responseMsg = " + responseMsg);
        return responseMsg;
    }
}


实际应用中,“模拟跳转”的地方应该考虑Activity finish()的问题,跳转到app的主体部分后,用户点击home键应该不再出现登录注册界面。

在RegisterActivity中“模拟跳转”,可以finish当前Activity并把信息传给LoginActivity,让LoginActivity执行跳转并finish,以保证两个Activity都不再出现。

传递信息给LoginActivity我想到的方法有两种,一种是用有返回的Intent,另一种是用可长期保存数据的SharedPreferences。

使用SharedPreferences的好处是,我们还可以通过检查SharedPreferences的信息实现自动跳转,也就是当用户再次打开app时可以自动登录。


至此,客户端的工作完成。服务器端的工作请看下一篇。

代码下载:

客户端 http://download.csdn.net/detail/qq_24833289/9620063

服务器 http://download.csdn.net/detail/qq_24833289/9620008


你可能感兴趣的:(Android开发)