使用的第三方jar:ksoap2-android-assembly-3.0.0-jar-with-depend.jar
-------------------------------------
简单的需求:
输入用户名和密码,取得token;
-------------------------------------
一个简单的登入界面:
public class MainActivity extends Activity {
protected static final String TAG = "MainActivity";
private EditText et_user_name;
private EditText et_user_password;
private Button bt_login;
private String mobileAppVersion = "V1.0";
private Context context = this;
private WebServices webServices = null;
private String str_user_name = null;
private String str_user_password = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
et_user_name = (EditText) findViewById(R.id.user_name);
et_user_password = (EditText) findViewById(R.id.user_password);
bt_login = (Button) findViewById(R.id.user_login);
bt_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
str_user_name = et_user_name.getText().toString().trim();
str_user_password = et_user_password.getText().toString()
.trim();
Log.i(TAG, "onClick::::::str_user_name: " + str_user_name
+ "####" + "str_user_password: " + str_user_password);
new LoginAsy().execute(); // 联网登入异步加载
/*
* // 执行此操作不能再主线程中 LoginResult loginResult =
* webServices.userLogin(context, str_user_name,
* mobileAppVersion, str_user_password);
*
* if (loginResult != null) {
*
* String token = loginResult.getToken();
*
* Log.i(TAG, "token========>" + token); }
*/
}
});
}
class LoginAsy extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
webServices = new WebServices();
try {
Log.i(TAG, "LoginAsy:::::::str_user_name: " + str_user_name
+ "####" + "str_user_password: " + str_user_password);
LoginResult loginResult = webServices.userLogin(context,
str_user_name, mobileAppVersion, str_user_password);
if (loginResult != null) {
String token = loginResult.getToken();
Log.i(TAG, "token========>" + token);
}
} catch (Exception e) {
Log.i(TAG, e.toString());
}
return null;
}
}
}
userLogin
登入执行的功能要联网后执行的动作,就不能再主线程执行。最初没有整明白这点原因,就直接写在主线程中。一直查找原因到WebServices.userLogin里面
查到transport.call(SOAPACTION, envelope, null); 死活就是不执行。无任何结果,也不爆出异常错误信息。这句不执行就没有的到数据。
网上疯狂的度资料,原来先人们也有过遇到这个坑的,折腾半天,浪费好多时间。
public LoginResult userLogin(Context context, String loginKey,
String mobileAppVersion, String password) {
String methodName = "userLogin";
LoginResult logResult = null;
try {
SoapObject soapObject = new SoapObject(NAMESPACE, methodName);
if (loginKey != null) {
soapObject.addProperty("loginKey", loginKey);
}
if (mobileAppVersion != null) {
soapObject.addProperty("mobileAppVersion", mobileAppVersion);
}
if (password != null) {
password = MD5.getMD5Str(password);
soapObject.addProperty("password", password);
}
/*soap v1.1*/
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.setOutputSoapObject(soapObject);
envelope.bodyOut = soapObject;
envelope.dotNet = false;
HttpTransportSE transport = new HttpTransportSE(ENDPOINT, timeout);
transport.call(SOAPACTION, envelope, null);
Log.i(TAG, "transport ++++++++++++ transport.call"); // 未执行的原因是,调用此类不能在主线程中执行~
if (envelope.getResponse() != null) {
logResult = new LoginResult();
/*返回的数据*/
Log.i(TAG, envelope.getResponse().toString());
SoapObject so = (SoapObject) envelope.getResponse();
logResult.setCode(Integer.valueOf(so.getProperty("code")
.toString()));
logResult.setMessage(so.getProperty("message").toString());
if (logResult.getCode() == 0) {
logResult.setCc(so.getProperty("cc").toString());
logResult.setUserName(so.getProperty("userName").toString());
logResult.setToken(so.getProperty("token").toString());
logResult.setServerSystemTime(Long.getLong(so.getProperty(
"serverSystemTime").toString()));
}
}
} catch (Exception e) {
// TODO: handle exception
}
return logResult;
}
下面是MD5的算法:
package com.example.test01;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
public static String getMD5Str(String str) {
MessageDigest messageDigest = null;
try
{
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(str.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e)
{
System.out.println("NoSuchAlgorithmException caught!");
System.exit(-1);
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
byte[] byteArray = messageDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i < byteArray.length; i++)
{
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
return md5StrBuff.toString();
}
}