德克云技术联盟

会员中心
发新帖
打印 上一主题 下一主题

探索新技术经验分享(三)从探索Android开发看新技术的研究
发布人: 李昭 发布时间:2014-10-27 浏览:6776

        首先在前面说明一下,这个论题在上次的培训会上讲过,在这里整理一下,作为新技术的研究指导文件,给后来的朋友们作为经验分享。

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

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







捕获.PNG (68.78 KB, 下载次数: 3963)

捕获.PNG

分类浏览
关于我们
联系我们
技术联盟
云服务
云技术
云合作
帮助中心
发帖规则
QQ客服
内部通道
企业邮箱
企业论坛
版本选择
手机版
电脑版
用手机扫描下方二维码查看手机版页面

版权所有 西安云联电子科技有限公司
Copyright @ 2011-2022 | decoclouds.com All Rig
陕ICP备13002202号-1

快速回复 返回顶部 返回列表