由于Android学得渣,想学点项目来丰富项目经验,咨询了老师,老师觉得我菜所以推荐我学《Android疯狂讲义》上最后的电子拍卖系统项目,过程痛并快乐着,且看且学。但有时候自己的粗心大意会使自己崩溃的,所以朋友们还是细心点好。每一次粗心的bug都令我痛不欲生,找到答案后又想拍死自己!
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import com.lq.client.util.HttpUtil;
import com.lq.auction.DialogUtil;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class Login extends Activity {
EditText etName, etPass;
Button bnLogin, bnCancel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
etName = (EditText) findViewById(R.id.userEditText);
etPass = (EditText) findViewById(R.id.pwdEditText);
bnLogin = (Button) findViewById(R.id.bnLogin);
bnLogin = (Button) findViewById(R.id.bnCancel);
bnCancel.setOnClickListener(new HomeListener(this));
bnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (validate()) {
if (loginPro()) {
Intent intent = new Intent(Login.this,
AuctionClientActivity.class);
startActivity(intent);
finish();
} else {
DialogUtil.showDialog(Login.this
, "用户名称或者密码错误,请重新输入!", false);
}
}
}
});
}
private boolean loginPro() {
//获取用户输入的用户名、密码
String username = etName.getText().toString();
String pwd = etPass.getText().toString();
JSONObject jsonObject;
try {
jsonObject = query(username,pwd); //查询用户名、密码是否正确
//如果userId大于0
if (jsonObject.getInt("userId")>0) {
return true;
}
} catch (Exception e) {
DialogUtil.showDialog(this
, "服务器异常,请稍后再试", false);
e.printStackTrace();
}
return false;
}
private boolean validate() {
String username = etName.getText().toString().trim();
if (username.equals("")) {
DialogUtil.showDialog(this, "用户账户必填", false);
return false;
}
String pwd = etPass.getText().toString().trim(); //trim():去掉前后空格
if (pwd.equals("")) {
DialogUtil.showDialog(this, "用户密码必填", false);
return false;
}
return true;
}
private JSONObject query(String username, String password)
throws Exception{
//使用Map封装参数
Map<String, String> map = new HashMap<String, String>();
map.put("user", username);
map.put("pass", password);
//定义发送请求的URL
String url = HttpUtil.BASE_URL + "login.jsp";
return new JSONObject(HttpUtil.postReuest(url, map));
}
}
报错是这样的
09-28 07:11:43.901: E/AndroidRuntime(836): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lq.auction/com.lq.auction.Login}: java.lang.NullPointerException
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.ActivityThread.access$600(ActivityThread.java:141)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.os.Handler.dispatchMessage(Handler.java:99)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.os.Looper.loop(Looper.java:137)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.ActivityThread.main(ActivityThread.java:5103)
09-28 07:11:43.901: E/AndroidRuntime(836): at java.lang.reflect.Method.invokeNative(Native Method)
09-28 07:11:43.901: E/AndroidRuntime(836): at java.lang.reflect.Method.invoke(Method.java:525)
09-28 07:11:43.901: E/AndroidRuntime(836): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-28 07:11:43.901: E/AndroidRuntime(836): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-28 07:11:43.901: E/AndroidRuntime(836): at dalvik.system.NativeStart.main(Native Method)
09-28 07:11:43.901: E/AndroidRuntime(836): Caused by: java.lang.NullPointerException
09-28 07:11:43.901: E/AndroidRuntime(836): at com.lq.auction.Login.onCreate(Login.java:35)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.Activity.performCreate(Activity.java:5133)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-28 07:11:43.901: E/AndroidRuntime(836): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
09-28 07:11:43.901: E/AndroidRuntime(836): ... 11 more
细心的朋友应该能找到一处,再细心一点的朋友应该能全找到。
没错就是这两句话:
bnLogin = (Button) findViewById(R.id.bnLogin);
bnLogin = (Button) findViewById(R.id.bnCancel);
bnCancel.setOnClickListener(new HomeListener(this));
bnLogin.setOnClickListener(new OnClickListener() {...
之前我看了报错,百度了答案,很多都是说的ui出错,可以我之前看了那么多遍都没看出来~~~但苦于找不到答案,只好一句话一句话看,好,TM的终于找到了,但错的有点奇葩,bnLogin和bnCancel的Listener弄反了!都是盲目一直照着书敲的结果,找到一处后运行,还是报错,这次我不再高估自己,仔细一个单词一个单词的看,一下就看到上面的bnCancel的按钮设置错了,这时我对自己已经无言以对。。。根本没有技术难度,却在这上面耗了这么久的时间,多久?前天到今天三个晚上。这是个教训,我要牢牢记住。不过也有客观原因,我的电脑配置太低,每一次运行都耗费很长时间,还很卡,so,我现在在教室做这件事,因为我不甘心哪~
做这个项目一开始还有个困难就是编译auction那个文件夹,找了很多文章才解决