在公司一个项目中用到了这样一种网络请求方式,在此记录学习。
1.java代码
/**
* 登录
*/
public class LogInActivity extends BaseActivity implements OnClickListener {
private TakeTimeAsyncTask tta;
private UIHandler handler;
// 定义控件
private EditText inputAccout;
private EditText inputPassword;
private Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
initView();
}
/**
* 初始化
*/
private void initView() {
inputAccout = (EditText) findViewById(R.id.et_accout);
inputPassword = (EditText) findViewById(R.id.et_password);
login = (Button) findViewById(R.id.bt_login);
login.setOnClickListener(this);
handler = new UIHandler();
// 点击软键盘done按钮执行登录功能
inputPassword
.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
login();
}
return false;
}
});
}
/**
* 登录
*/
private void login() {
if (inputAccout.getText().toString().trim().equals("")
&& inputPassword.getText().toString().trim().equals("")) {
inputAccout.requestFocus();
Toast.makeText(LogInActivity.this, "请输入账号和密码", Toast.LENGTH_SHORT)
.show();
} else if (inputAccout.getText().toString().trim().equals("")) {
inputAccout.requestFocus();
Toast.makeText(LogInActivity.this, "请输入账号", Toast.LENGTH_SHORT)
.show();
} else if (inputPassword.getText().toString().trim().equals("")) {
inputPassword.requestFocus();
Toast.makeText(LogInActivity.this, "请输入密码", Toast.LENGTH_SHORT)
.show();
} else {
Map<String, String> map = new HashMap<String, String>();
map.put("gongHao", inputAccout.getText().toString());
map.put("miMa", Md5Utils.MD5(inputPassword.getText().toString()));
map.put("url", Contants.LOGIN);
tta = new TakeTimeAsyncTask(LogInActivity.this, handler,
Contants.SUCCEED_LOGIN, 1);
tta.execute(map);
}
}
public class UIHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case Contants.SUCCEED_LOGIN:
if (!"".equals(msg.obj.toString())) {
if ((msg.obj.toString()).equals("1")) {
inputAccout.setText("");
inputPassword.setText("");
inputAccout.requestFocus();
Toast.makeText(LogInActivity.this, "账号错误",
Toast.LENGTH_SHORT).show();
}
if ((msg.obj.toString()).equals("2")) {
inputPassword.setText("");
inputPassword.requestFocus();
Toast.makeText(LogInActivity.this, "密码错误",
Toast.LENGTH_SHORT).show();
}
// 解析JSON数据
try {
JSONObject jsonObject = new JSONObject(
msg.obj.toString());
Map<String, String> mapLogin = new HashMap<String, String>();
mapLogin.put("sysID", jsonObject.getString("sysID"));
mapLogin.put("gongHao", jsonObject.getString("gongHao"));
mapLogin.put("quanXianSysID",
jsonObject.getString("quanXianSysID"));
Intent intent = new Intent(LogInActivity.this,
SidebarActivity.class);
startActivity(intent);
finish();
} catch (JSONException e) {
e.printStackTrace();
}
} else {
System.out.println(msg.obj.toString());
}
break;
default:
Toast.makeText(LogInActivity.this, "网络异常", Toast.LENGTH_SHORT)
.show();
break;
}
}
}
/**
* 重载方法
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_login:
login();
break;
}
}
/**
* 点击返回按钮,程序后台运行
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(false);
return true;
}
return super.onKeyDown(keyCode, event);
}
}
2.TakeTimeAsyncTask.java
public class TakeTimeAsyncTask extends AsyncTask<Object, Object, Object> {
public final static String CONEXCEPTION = "网络异常,请重新操作";
private Context context;
private Handler handler;
private ServerDateUtil sdu = null;
private int resultwhat = 0;
private CustomProgressDialog dialog = null;
private int dialogflag = 0;
private TimeCount time;
public TakeTimeAsyncTask(Context con, Handler handler, int resultwhat,
int dialogflag) {
context = con;
this.handler = handler;
this.resultwhat = resultwhat;
dialog = CustomProgressDialog.getCustomProgressDialog(context,
R.style.CustomProgressDialog);
this.dialogflag = dialogflag;
}
@Override
protected void onPreExecute() {
if (dialogflag == 1 && dialog != null) {
dialog.showDailog("");
time = new TimeCount(20000, 500);
time.start();
}
}
@Override
protected Object doInBackground(Object... params) {
if (NetworkDetector.detect(context)) {
// 请求服务器获取更新
sdu = ServerDateUtil.getInstance(context, handler);
return sdu.getServer(resultwhat,
(HashMap<String, String>) params[0]);
} else {
Message message = handler.obtainMessage(Contants.DEFEATED);
message.obj = resultwhat;
message.sendToTarget();
dialog.stopDailog();
}
return null;
}
@Override
protected void onPostExecute(Object result) {
int w = 0;
if (result == null || result.toString().equals(CONEXCEPTION)) {
w = Contants.DEFEATED;
} else {
w = resultwhat;
}
Message message = handler.obtainMessage(w);
message.obj = result;
message.sendToTarget();
dialog.stopDailog();
}
class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long arg0) {
time.cancel();
}
@Override
public void onFinish() {
dialog.stopDailog();
}
}
}
3.ServerDateUtil.java
/**
* 执行网络请求
*
*/
public class ServerDateUtil {
public final static String CONEXCEPTION = "网络异常,请重新操作";
private static ServerDateUtil fetcher;
private final static int TIMEOUT = 20000;
private static HttpPost req;
private static HttpResponse rep;
private static DefaultHttpClient client;
private static List<NameValuePair> params;
public static ServerDateUtil getInstance(Context con, Handler handler) {
if (fetcher == null) {
fetcher = new ServerDateUtil();
}
if (client == null) {
BasicHttpParams params = new BasicHttpParams();
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
final SSLSocketFactory sslSocketFactory = SSLSocketFactory
.getSocketFactory();
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(
params, schemeRegistry);
client = new DefaultHttpClient(cm, params);
final HttpParams param = client.getParams();
HttpConnectionParams.setConnectionTimeout(param, TIMEOUT);
HttpConnectionParams.setSoTimeout(param, TIMEOUT);
ConnManagerParams.setTimeout(param, TIMEOUT);
}
return fetcher;
}
/**
* 从服务器取数据列表 参数第一个为URL
*
* @return
*/
public String getServer(int what, HashMap<String, String> param) {
String url = param.get("url");
param.remove("url");
Set<String> set = param.keySet();
Object[] item = set.toArray();
params = new ArrayList<NameValuePair>();
for (int i = 0; i < item.length; i++) {
String name = (String) item[i];
String value = (String) param.get(name);
params.add(new BasicNameValuePair(name, value));
}
try {
req = new HttpPost(url);
HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
req.setHeader(entity.getContentType());
req.setEntity(entity);
rep = client.execute(req);
if (rep.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(rep.getEntity());
}
} catch (Exception e) {
e.printStackTrace();
}
return CONEXCEPTION;
}
}
4.NetworkDetector..java
public class NetworkDetector {
public static boolean detect(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
if (manager == null) {
return false;
}
NetworkInfo networkinfo = manager.getActiveNetworkInfo();
if (networkinfo == null || !networkinfo.isAvailable()) {
return false;
}
return true;
}
}