首先在前面说明一下,这个论题在上次的培训会上讲过,在这里整理一下,作为新技术的研究指导文件,给后来的朋友们作为经验分享。
为什么要把这个论题提出来说一说,是因为之前发现程序员在探索新技术时,将大量时间用在了不必要的探索上面,我们这个团队从目前状态上来说,是面向应用的一个团队,这种无意义的探索,不,也不能说无意义,应该是对当前紧急需要实现的项目产生不了作用的探索,实际上对项目的开发周期形成了较为严重的影响。这对这种情况我们应该怎么处理,此处将我对这一情况的一些通常的处理办法总结一下,以供参考。
通常,对一个新的技术或者说框架,其实从根本上来说我们需要解决的问题只有两个,其他问题基本都属于细节问题。这两个问题是什么呢?第一个:控件(组件)怎么呈现?第二个问题,怎么通过控件(组件)从后台获取数据?有人可能有异议了,这里要解释一下。如果你学过软件开发,根据现下的程序员成长知识的建构,你一定要学习MVC。什么是MVC?它的精髓并不是三层架构那么个带数字的东西,MVC的最重要的东西是告诉你表现和业务需要分离。只要明白这个,回过头来看所有新技术(框架),他们基本上都要解决这个问题,这个问题绕不开。那么实际上我们在学习、探索新框架的时候,从这两点入手,那么所有问题基本都迎刃而解,对于快速掌握学习这种新技术(框架)很有价值。下面就对这两方面的方法进行详细举例说明。
在SFE项目之前,我是没有接触过Android开发的,拿到这个任务的时候,我倒是觉得十分有趣,所以先去网上看看有什么android开发的工具,依照以前的经验,往往开发这些新技术的公司,通常都有比较成熟或者正在成熟过程中的开发工具。在网上搜了搜,最后发现Android——SDK包里面有google提供的eclipse,这就是了。
开发环境配置主要是JDK的安装,按上配套的就好了。
点击打开SDK的安装,因为计划要开发android4.0以上的SFE,所以安装了4.0以上所有版本的SDK。
之后进入Eclipse,进去看看。
下面正式开始探索。
1、新建个Android项目,系统会提示你自建一个MainAvtivity。那就按照他的来吧。
2、建好之后,目录结构应该是这样的:
3、关于各文件夹的作用在这里不解释了,有兴趣可以去看看网上资料。这里只讲最主要的。打开res\layout\activity_main.xml,工具会给出可视化界面,从左面的工具箱里拖个按钮过去。如图:
4、看看文件名就知道,res\layout\activity_main.xml和src\com.example.test\MainActivity.java文件是前后台的对应关系。这个和asp.net里面的aspx页面简直一模一样,写法不同而已。能不能验证一下呢?好,我就设计点击这个按钮,让默认的“hellow world”变成“下楼”。
5、在网上查了一下,android里面给按钮添加点击事件需要在MainActivity.java的onCreate事件里面完成。有点不智能,但是跟aspx页面的方式差不多。
那就在MainActivity.java加以下代码吧:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO 自动生成的方法存根
TextView text=(TextView)findViewById(R.id.textView1);
text.setText("下楼");
}
});
}
刚写完的时候,会有错误提示,引入相对的引用后就没了。调试一下。通过。
6、是不是很简单?前面说了探索一个新问题主要先要解决两个问题,一个是呈现,一个是数据来源。下面就看看数据来源。
我们知道,在java里面用过servlet可以返回数据,那我们就先写一个简单的servlet来返回字符串“今天你吃了没有?”。这里不做代码介绍,不会做的话回去恶补一下servlet,那是java基本技术。
7、android里面怎么发起网络请求呢?看下面的方法:
public String request2(String urlStr, DFMsg dfmsg) throws UnsupportedEncodingException, IOException {
// TODO Auto-generated method stub
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setConnectTimeout(120000);
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
OutputStreamWriter out = new OutputStreamWriter(
connection.getOutputStream(), "utf-8");
String str=DFMsg.toJson(dfmsg);
out.write("DFMsg="+str);
out.flush();
out.close();
String sCurrentLine = "";
String sTotalString = "";
InputStream l_urlStream = connection.getInputStream();
BufferedReader l_reader = new BufferedReader(
new InputStreamReader(l_urlStream,"utf-8"));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine;
}
return sTotalString;
}
8、 好了,把它做成一个类吧:
package deco.sfe.global;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import df.util.dfmsg.DFMsg;
public class MyRequest {
public DFMsg request(String urlStr, DFMsg dfmsg) throws IOException{
// TODO Auto-generated method stub
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setConnectTimeout(120000);
connection.setRequestMethod("POST");
connection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(
connection.getOutputStream(), "utf-8");
String str=DFMsg.toJson(dfmsg);
out.write("DFMsg="+str);
out.flush();
out.close();
String sCurrentLine = "";
String sTotalString = "";
InputStream l_urlStream = connection.getInputStream();
BufferedReader l_reader = new BufferedReader(
new InputStreamReader(l_urlStream,"utf-8"));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine;
}
DFMsg result=DFMsg.fromJson(sTotalString);
return result;
}
public String request2(String urlStr, DFMsg dfmsg) throws UnsupportedEncodingException, IOException {
// TODO Auto-generated method stub
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setConnectTimeout(120000);
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
OutputStreamWriter out = new OutputStreamWriter(
connection.getOutputStream(), "utf-8");
String str=DFMsg.toJson(dfmsg);
out.write("DFMsg="+str);
out.flush();
out.close();
String sCurrentLine = "";
String sTotalString = "";
InputStream l_urlStream = connection.getInputStream();
BufferedReader l_reader = new BufferedReader(
new InputStreamReader(l_urlStream,"utf-8"));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine;
}
return sTotalString;
}
public synchronized String httpPostRequest(String url,DFMsg dfmsg) throws NullPointerException, ParseException, IOException {
String resultStr = null;
/*建立HTTPost对象*/
HttpPost httpRequest = new HttpPost(url);
/*
* NameValuePair实现请求参数的封装
*/
List<NameValuePair> params = new ArrayList<NameValuePair>();
String str=DFMsg.toJson(dfmsg);
params.add(new BasicNameValuePair("DFMsg", str));
/* 添加请求参数到请求对象*/
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
DefaultHttpClient httpClient = null;
/* 发送请求并等待响应 */
if(null == httpClient){
httpClient = new DefaultHttpClient();
}
// 请求超时
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
// LogUtil.sv("httpRequest", "请求超时 " +30+"s");
// 读取超时
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 6000);
// LogUtil.sv("httpRequest", "读取超时 " +6+"s");
HttpResponse httpResponse = httpClient.execute(httpRequest);
/*若状态码为200 ok*/
if (httpResponse.getStatusLine().getStatusCode() == 200) {
/*读返回数据*/
resultStr = EntityUtils.toString(httpResponse.getEntity());
return resultStr;
}
return "{\"errorcode\":\"9\",\"errormsg\":\"请求未发出。\"}";
}
}
9、好了,到这里连接后端数据没问题,但是android里面不像别的,它是由异步机制获取数据的,以防止服务器没有回传数据时将当前应用卡死。所以我们得采用异步线程来调取这个类来获取数据。
在MainAvtivity.java里面面先写个回来的句柄。顺便把button里面的动作改一改。
package com.example.test;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import df.util.dfmsg.DFMsg;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private MyHandler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button)findViewById(R.id.button1);
myHandler=new MyHandler();
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
loadData(MainActivity.this,myHandler);
}
});
}
private void loadData(final MainActivity mainActivity,final MyHandler myHandler2) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String dfamPath="http://10.0.4.105:1234/DFAM/action.do?";
MyRequest r=new MyRequest();
DFMsg dfmsg=DFMsg.fromJson("{}");
dfmsg.setApi("SFEClientService.Customer.getInfo");
String result;
result = r.request2(dfamPath, dfmsg);
//正确数据
Message msg = new Message();
msg.what = -1;
Bundle bundle = new Bundle();
bundle.putString("DFMsg",result);
msg.setData(bundle);
myHandler.sendMessage(msg);
} catch (UnsupportedEncodingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}).start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int what=msg.what;
switch (what) {
case -1:
String info=msg.getData().get("info").toString();
TextView text=(TextView)findViewById(R.id.textView1);
text.setText(info);
break;
default:
break;
}
}
}
}
10、ok了,这样从后台来的数据就被写到页面上去了。数据通了,下一讲将讲讲怎么样把这条路弄得更通顺一些。
|
|