从探索Android开发看新技术的研究

来源:互联网 发布:训练眼睛的软件 编辑:程序博客网 时间:2024/06/14 16:52
首先在前面说明一下,这个论题在上次的培训会上讲过,在这里整理一下,作为新技术的研究指导文件,给后来的朋友们作为经验分享。

        为什么要把这个论题提出来说一说,是因为之前发现程序员在探索新技术时,将大量时间用在了不必要的探索上面,我们这个团队从目前状态上来说,是面向应用的一个团队,这种无意义的探索,不,也不能说无意义,应该是对当前紧急需要实现的项目产生不了作用的探索,实际上对项目的开发周期形成了较为严重的影响。这对这种情况我们应该怎么处理,此处将我对这一情况的一些通常的处理办法总结一下,以供参考。

       通常,对一个新的技术或者说框架,其实从根本上来说我们需要解决的问题只有两个,其他问题基本都属于细节问题。这两个问题是什么呢?第一个:控件(组件)怎么呈现?第二个问题,怎么通过控件(组件)从后台获取数据?有人可能有异议了,这里要解释一下。如果你学过软件开发,根据现下的程序员成长知识的建构,你一定要学习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了,这样从后台来的数据就被写到页面上去了。数据通了,下一讲将讲讲怎么样把这条路弄得更通顺一些。



阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁幼儿呕吐怎么办 孩子受凉呕吐拉肚子怎么办 5岁儿童呕吐怎么办 小孩发烧老是吐怎么办 宝宝吃雪糕呕吐怎么办 小孩感冒发烧吐怎么办 宝宝呕吐加发热怎么办 七个月宝拉肚子怎么办 新生儿17天拉稀怎么办 七个半月宝宝拉肚子怎么办 七个月婴儿拉稀怎么办 宝宝不停的拉稀怎么办 猫咪受凉了呕吐怎么办 孩子生理性腹泻怎么办 婴儿肚子受凉了怎么办 小孩说话有点口吃怎么办 3岁宝宝先拉后吐怎么办 1岁宝宝拉肚子怎么办 2岁宝宝结巴怎么办 小孩吐和拉肚子怎么办 头外伤后头晕怎么办 紧张性神经头痛怎么办 小孩吃饱受凉吐怎么办 宝宝吃饱受凉吐怎么办 孩子凉了胃怎么办 宝宝哭的抽搐怎么办 孩子哭抽了怎么办 淋结巴肿大怎么办一年 20岁说话说不清怎么办 小孩突然出鼻血怎么办 三岁说不清话怎么办 说话连不成句怎么办 宝宝生理性腹泻怎么办? 母乳生理性腹泻怎么办 婴儿上吐下泄怎么办 两岁说话口吃怎么办 孩子老是玩手机怎么办 宝宝长期看手机怎么办 初中生要玩手机怎么办 小孩子讲话有点结巴怎么办 一岁宝宝贫血怎么办