1、安卓的Http网络请求有两种,HttpUrlConnection和HttpClient ,这里用了HttpClient连接。听说安卓的HttpUrlConction更好,以后可以尝试。
2、安卓4.0以后不能在主线程中执行网络请求,所以要创建一个新的线程(子线程)
3、在子线程中不能用Toask.makeText(),方法和AlertDialog,会报一个 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 异常。 使用Looper.prepare(). 和Looper.loop()可以解决
主要的原因解答:http://284772894.iteye.com/blog/1751865
http://blog.csdn.net/heng615975867/article/details/9194219
package org.lin.util;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import com.lin.view.LoginActivity;
import android.os.Handler;
import android.os.Message;
public class HttpUtil {
public static final String BASE_URL = "http://192.168.56.1:8080/Order_Server/";
private static HttpResponse resp ;
private static DefaultHttpClient mClient = new DefaultHttpClient();
private HttpPost post;
private HttpGet get;
//Post方法
public String doPost(MyHttpResquest resquest){
System.out.println("准备发送一个post请求");
post = new HttpPost(resquest.getUrl());
String result = "";
try {
post.setEntity(new UrlEncodedFormEntity(resquest.getParams(),"utf-8"));
System.out.println("执行前");
resp = mClient.execute(post);
System.out.println("执行后");
if (resp.getStatusLine().getStatusCode()==200) {
System.out.println("得到响应");
result = EntityUtils.toString(resp.getEntity());
Document doc = Jsoup.parse(result);
result = doc.body().text();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
post.abort();
}
return result;
}
//Get方法
public String doGet(MyHttpResquest resquest)
{
System.out.println("准备发送一个get请求");
get = new HttpGet(resquest.getUrl());
String result = "";
try {
System.out.println("执行前");
resp = mClient.execute(get);
System.out.println("执行后");
if (resp.getStatusLine().getStatusCode()==200) {
System.out.println("得到响应");
result = EntityUtils.toString(resp.getEntity(),"utf-8");
Document doc = Jsoup.parse(result);
result = doc.body().text();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
get.abort();
}
return result;
}
}
package com.lin.view;
import org.jsoup.nodes.Document;
import org.lin.util.HttpUtil;
import org.lin.util.MyHttpResquest;
import org.lin.util.NetConstant;
import com.example.order_client.R;
import com.lin.helper.CircularImage;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.R.string;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.BitmapFactory;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.text.Editable;
import android.text.Layout;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
public class LoginActivity extends Activity implements OnFocusChangeListener,OnClickListener,TextWatcher
{
private static ImageView head_icon,login_user,login_account_edit_clear,login_key,login_key_edit_clear;
private static EditText login_edit_account,login_edit_key;
private static Button login_btn;
private static TextView login_regist,login_forget;
private static ScrollView scrollView;
private static LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
init();
//getWindow().setFeatureInt(featureId, value) 自定义标题
}
private void init()
{
layout = (LinearLayout)findViewById(R.id.login_layout);
layout.setOnClickListener(this);
//head_icon = (ImageView)findViewById(R.id.login_icon);
CircularImage cover_head_icon = (CircularImage)findViewById(R.id.cover_head_icon);
cover_head_icon.setImageResource(R.drawable.default_head_icon);
login_user = (ImageView)findViewById(R.id.login_user);
login_account_edit_clear = (ImageView)findViewById(R.id.login_account_edit_clear);
login_account_edit_clear.setOnClickListener(this);
login_key = (ImageView)findViewById(R.id.login_key);
login_key_edit_clear = (ImageView)findViewById(R.id.login_key_edit_clear);
login_key_edit_clear.setOnClickListener(this);
login_edit_account =(EditText)findViewById(R.id.login_edit_account);
login_edit_account.addTextChangedListener(this);
login_edit_account.setOnFocusChangeListener(this);
login_edit_key = (EditText)findViewById(R.id.login_edit_key);
login_edit_key.addTextChangedListener(this);
login_edit_key.setOnFocusChangeListener(this);
login_btn = (Button)findViewById(R.id.login_btn);
login_btn.setOnClickListener(this);
login_regist = (TextView)findViewById(R.id.login_regist);
login_regist.setOnClickListener(this);
login_forget = (TextView)findViewById(R.id.login_forget);
login_forget.setOnClickListener(this);
scrollView = (ScrollView)findViewById(R.id.login_scroller);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId())
{
case R.id.login_btn:
//登陆按钮
login();
break;
case R.id.login_account_edit_clear:
login_edit_account.setText("");
break;
case R.id.login_key_edit_clear:
login_edit_key.setText("");
break;
case R.id.login_regist:
Toast.makeText(this, "用户注册", Toast.LENGTH_SHORT).show();
startActivity(new Intent().setClass(LoginActivity.this, RegistActivity.class));
break;
case R.id.login_forget:
Toast.makeText(this, "忘记密码", Toast.LENGTH_SHORT).show();
break;
case R.id.login_layout:
//点击空白处隐藏虚拟键盘
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
default:
break;
}
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.login_edit_account:
if (hasFocus) {
login_account_edit_clear.setVisibility(View.VISIBLE);
}else {
login_account_edit_clear.setVisibility(View.GONE);
}
break;
case R.id.login_edit_key:
if (hasFocus) {
login_key_edit_clear.setVisibility(View.VISIBLE);
}else {
login_key_edit_clear.setVisibility(View.GONE);
}
default:
break;
}
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if (s!=null) {
if (s.equals(login_edit_account.getText())) {
login_user.setBackgroundResource(R.drawable.login_user_hightlighted);
}
if (s.equals(login_edit_key.getText())) {
login_key.setBackgroundResource(R.drawable.login_key_hightlighted);
}
if (s.length()==0) {
if (login_edit_account.getText().length()==0) {
login_user.setBackgroundResource(R.drawable.login_user);
}
if(login_edit_key.getText().length()==0){
login_key.setBackgroundResource(R.drawable.login_key);
}
}
}
}
//登陆方法
public void login()
{
new Thread(){
public void run()
{
String username = login_edit_account.getText().toString();
String password = login_edit_key.getText().toString();
String checkStr = "action=login&username="+username+"&password="+password;
String url = HttpUtil.BASE_URL+"AccountServlet?"+checkStr;
System.out.println("url="+url);
MyHttpResquest myHttpResquest = new MyHttpResquest(NetConstant.TYPE_GET, url, null,true);
String result = new HttpUtil().doGet(myHttpResquest);
if (result.equals("success")) {
System.out.println("登陆成功");
//startActivity(new Intent(LoginActivity.this,RegistActivity.class));
}else {
Looper.prepare();
//ShowDialog("账号或密码错误");
Toast.makeText(LoginActivity.this, "账号或密码错误", Toast.LENGTH_SHORT).show();
Looper.loop();
System.out.println("登陆失败");
}
}
}.start();
}
public void saveUserMSG(String result)
{
//保存登陆信息
}
public void ShowDialog(String msg)
{
Builder builder = new Builder(this);
builder.setMessage(msg).setCancelable(false).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
}