在上一篇中我们获取到了数据,即用户名和密码。接下来我们要将数据发送到写好的服务器端进行解析。在这里就要进行网络访问了。需要添加一个权限。
在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则…
到这里我们就实现了用户的登陆。具体的代码都在上边贴出来了。还有疑问的地方可以留言。如有写错的地方希望大佬批评指正。