Android中构建数据业务应用

Android中构建数据业务应用

    构建Android中的数据业务应用,Android提供了几种网络访问方式: 移动IP网络(GPRS,基于移动网络的数据应用层 ),WiFi,蓝牙。这里讨论的是基于第一种方式的网络应用。Android主要提供了java.net和org.apache.httpclient两个包来处理相关的网络应用,另外还有android.net这个包,它只是对org.apache.httpclient进行了简单的封装,所以重点介绍apache包的应用,当然也会对java.net作简单介绍。

    

    1:检查网络连接状态

     Android提供各种后台Service以便我们可以获得系统共用对象的实例,ConectivityManager是用来检查网络连接的类,下面代码是它通用使用方法:

     ConnectivityManager  mConnMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

   

    2:Android中简单的Http访问

    首先通过一个简单的例子使用标准的Java.net API 通过Http Get方法来从指定URL获得一个简单的Html流。Http Get请求只需要把查询参数放入请求的URL中,

    private String getHttpResponse(String location) {

           String result = null;

            URL url = null;

     try {

         url = new URL(location); //构造一个URL对象

        } catch (MalformedURLException e) {

        Log.e(Constants.LOGTAG, “ERROR”, e);

       }

        if (url != null) {

           try {

            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); //使用HttpURLConnection打开连接

            BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));//为输出创建BufferedReader

            String inputLine;

            int lineCount = 0; // limit the lines for the example

           while ((lineCount < 10) && ((inputLine = in.readLine()) != null)) { //读Response中的数据

                    lineCount++;

                    result += “\n” + inputLine; #6

           }

           in.close();

          urlConn.disconnect();

         } catch (IOException e) {

          Log.e(Constants.LOGTAG, “ERROR”, e);

          }

     } else {

          Log.e(Constants.LOGTAG, ” url NULL”);

          }

         return result;

      }

}

     通过上面可以看到,通过Http访问数据在Anroid是很容易的,但是在实际应用中,通常都是复杂频繁的网络请求访问而不是如例子中简单的获取数据,如果这样的话,例子中的做法就会变得很笨重,为了对Java.net中的类可以被更好的使用,apache提供了HttpClient,它对Java.net中的类做了封装和更好的抽象,用来支持设计更复杂的Http应用,而且能在独立的线程上处理这些请求。

    3:使用HttpClient

     这个例子展示了怎样把网络访问请求运行的独立的线程之中,它使用了Apache的ResponseHandler和Android Handler。

    private final Handler handler = new Handler() {     //创建一个Android Handler

         @Override

          public void handleMessage(final Message msg) {

            progressDialog.dismiss();

            String bundleResult = msg.getData().getString(“RESPONSE”);//在Handler内部来处理刷新UI

            ApacheHTTPSimple.this.output.setText(bundleResult);

         }

};

private void performRequest() {

      final ResponseHandler<String> responseHandler = new ResponseHandler<String>() { //使用ResponseHandler来创建一个异步的Http调用

                  public String handleResponse(HttpResponse response) {//实现OnResponse的回调函数

                        StatusLine status = response.getStatusLine();

                        HttpEntity entity = response.getEntity();//获得Response的Entity

                        String result = null;

                        try {

                           result = StringUtils.inputStreamToString(entity.getContent());

                           Message message = new Message();

                           Bundle bundle = new Bundle();

                           bundle.putString(“RESPONSE”, result);

                           message.setData(bundle);

                           handler.sendMessage(message); //向UI handler发送消息,把Http请求的数据传递给UI进程

                         } catch (IOException e) {}

                        return result;

                      }

                  };

      this.progressDialog = ProgressDialog.show(this, “working . . .”, “performing HTTP request”);

      new Thread() {//使用一个独立线程进行Http请求

            @Override

            public void run() {

                   try {

                       DefaultHttpClient client = new DefaultHttpClient();

                       HttpGet httpMethod = new HttpGet(ApacheHTTPSimple.this.urlChooser.getSelectedItem().toString());//根据URL创建一个HttpGet对象

                       client.execute(httpMethod, responseHandler); //通过HttpClient运行HttpGet

                      } catch (ClientProtocolException e) {

                      Log.e(Constants.LOGTAG, ” ” + ApacheHTTPSimple.CLASSTAG, e);

                     } catch (IOException e) {

                          Log.e(Constants.LOGTAG, ” ” + ApacheHTTPSimple.CLASSTAG, e);

                     }

              }

         }.start();

}

以下是结构示意图

Android中构建数据业务应用

    现在我们已经了解了HttpClient的使用和基本的访问方法, 为了避免重复的创建代码,基于一个稳定的Http访问模型,下面通过分析WebKit的Http访问架构,来展现一个可以兼容Http Get ,Post,多任务而且容易管理结构模型。

    4: WebKit中Http访问架构解析

    下面是模型结构图:

    
Android中构建数据业务应用

把Http Request行为抽象到一个单例中,通过HttpClient进行Get或者Post访问。

ContractedBlock.gif
ExpandedBlockStart.gif
Code

public class NetworkManager {

    
private static NetworkManager sInstance = null;
    
private Context mContext = null;
    
private DefaultHttpClient mHttpClient = null;

    protected String mCookie=null;
   
    
private NetworkManager(Context context) {

        mContext 
= context;
        mHttpClient 
= new DefaultHttpClient();
    }
   
    
public static synchronized NetworkManager getInstance(Context context) {

        
if (null == sInstance) {

            sInstance 
= new NetworkManager(context);
        }   
        
return sInstance;
    }

    public boolean requestURL(String method, String url, Map<String, String> headers,
            
byte[] body, AbstractHttpHandler handler) {

        
//Check URL       
        if (!URLUtil.isValidUrl(url)) {

            Log.e(TAG, 
“Invalid URL:“ + url);
            handler.error(
–1, “Invalid URL:“ + url);
            
return false;
        }
       
        Log.d(TAG, 
“requestURL:“ + url);
       
       
        
//Http Request
        HttpUriRequest request = null;
       
        
if (HttpGet.METHOD_NAME.equalsIgnoreCase(method)) {

            
//HttpGet
            request = new HttpGet(url);
        } 
else {

            
//HttpPost
            if (null != body && body.length > 0) {

                Log.d(TAG, 
“Request Entity:“ + body.toString());
                
//post.setEntity(new InputStreamEntity(new ByteArrayInputStream(body), body.length));
                post.setEntity(new ByteArrayEntity(body));               
            }
            request 
= post;
        }
       
        
//Http Headers
        addHeaders(request, headers);   
       
        
//Cookie
        request.addHeader(“cookie“, this.mCookie);
       
        handler.setNetworkManager(
this);
        
//Cache it
        handler.setCachedRequestParam(method, url, headers, body);
       
        
//Connection Timeout
        HttpParams hp = mHttpClient.getParams();
        
if(null != hp) {

            ConnManagerParams.setTimeout(hp, 
5000);
        }
       
        
//Execute Request
        try {

            HttpResponse response 
= mHttpClient.execute(request);
       
            
//Handle Response
            handler.handleResponse(response);
        } 
catch(Exception e) {

            e.printStackTrace();   
        }
       
        
return true;
    }

    public void setCookie(String cookies){

        
this.mCookie=cookies;
    }
}

每个Task负责开启一个访问线程,与UI线程的交互都由Task来完成

ContractedBlock.gif
ExpandedBlockStart.gif
Code

public abstract class AbstractTask implements Runnable {

    
private final static String TAG = “AbstractTask“;
   
    
public final static int TASK_FINISHED = 1000;
   
    
protected Context mContext = null;
    
protected Handler mCallback = null;
    
private boolean mIsCanceled = false;
    
private int mTaskType=0;
   
    
public final static int ERROR_NO_ERROR = 0;
    
public final static int ERROR_FAILED = 1;
    
public final static int ERROR_RESPONSE_XML = 1000;
    
public final static int ERROR_RESQUEST_XML = 1001;
   
    
public final static int RESPONSE_STATUS_SUCCESS = 0;
   
    
protected int mErrorCode = ERROR_NO_ERROR;
    
protected String mErrorMsg = “”;
   
    
public AbstractTask(Context context, Handler callback) {

        mContext 
= context;
        mCallback 
= callback;
    }
   
    
protected synchronized void finishedCallback() {

        
if (null != mCallback && !isCanceled()) {

            Log.d(TAG, 
“finishedCallback“);
            Message msg 
= mCallback.obtainMessage(TASK_FINISHED, this);
            mCallback.sendMessage(msg);
            mCallback 
= null;
        }
    }
   
    
public synchronized void cancel() {

        mIsCanceled 
= true;
    }
   
    
public synchronized boolean isCanceled() {

        
return mIsCanceled;
    }
   
    
protected void setError(int code, String msg) {

        mErrorCode 
= code;
        mErrorMsg 
= msg;
    }
   
    
public int getErrorCode() {

        
return mErrorCode;
    }
   
    
public String getErrorMsg() {

        
return mErrorMsg;
    }
   
    
public String formatErrMsg() {

        
return “” + mErrorMsg + “(“ + mErrorCode + “)“;
    }
   
    
public Handler getCallbackHandler() {

        
return mCallback;
    }
    
public int getTaskType()
    {

        
return mTaskType;
    }
    
public void setTaskType(int type){

        mTaskType
=type;
    }
   
    
public void run() {

    }

}

//类似于ResponseHandler

ContractedBlock.gif
ExpandedBlockStart.gif
Code

public abstract class AbstractTask implements Runnable {

    
private final static String TAG = “AbstractTask“;
   
    
public final static int TASK_FINISHED = 1000;
   
    
protected Context mContext = null;
    
protected Handler mCallback = null;
    
private boolean mIsCanceled = false;
    
private int mTaskType=0;
   
    
public final static int ERROR_NO_ERROR = 0;
    
public final static int ERROR_FAILED = 1;
    
public final static int ERROR_RESPONSE_XML = 1000;
    
public final static int ERROR_RESQUEST_XML = 1001;
   
    
public final static int RESPONSE_STATUS_SUCCESS = 0;
   
    
protected int mErrorCode = ERROR_NO_ERROR;
    
protected String mErrorMsg = “”;
   
    
public AbstractTask(Context context, Handler callback) {

        mContext 
= context;
        mCallback 
= callback;
    }
   
    
protected synchronized void finishedCallback() {

        
if (null != mCallback && !isCanceled()) {

            Log.d(TAG, 
“finishedCallback“);
            Message msg 
= mCallback.obtainMessage(TASK_FINISHED, this);
            mCallback.sendMessage(msg);
            mCallback 
= null;
        }
    }
   
    
public synchronized void cancel() {

        mIsCanceled 
= true;
    }
   
    
public synchronized boolean isCanceled() {

        
return mIsCanceled;
    }
   
    
protected void setError(int code, String msg) {

        mErrorCode 
= code;
        mErrorMsg 
= msg;
    }
   
    
public int getErrorCode() {

        
return mErrorCode;
    }
   
    
public String getErrorMsg() {

        
return mErrorMsg;
    }
   
    
public String formatErrMsg() {

        
return “” + mErrorMsg + “(“ + mErrorCode + “)“;
    }
   
    
public Handler getCallbackHandler() {

        
return mCallback;
    }
    
public int getTaskType()
    {

        
return mTaskType;
    }
    
public void setTaskType(int type){

        mTaskType
=type;
    }
   
    
public void run() {

    }

}

//Demo Task,继承AbstractTask

ContractedBlock.gif
ExpandedBlockStart.gif
Code

public abstract class AbstractTask implements Runnable {

    
private final static String TAG = “AbstractTask“;
   
    
public final static int TASK_FINISHED = 1000;
   
    
protected Context mContext = null;
    
protected Handler mCallback = null;
    
private boolean mIsCanceled = false;
    
private int mTaskType=0;
   
    
public final static int ERROR_NO_ERROR = 0;
    
public final static int ERROR_FAILED = 1;
    
public final static int ERROR_RESPONSE_XML = 1000;
    
public final static int ERROR_RESQUEST_XML = 1001;
   
    
public final static int RESPONSE_STATUS_SUCCESS = 0;
   
    
protected int mErrorCode = ERROR_NO_ERROR;
    
protected String mErrorMsg = “”;
   
    
public AbstractTask(Context context, Handler callback) {

        mContext 
= context;
        mCallback 
= callback;
    }
   
    
protected synchronized void finishedCallback() {

        
if (null != mCallback && !isCanceled()) {

            Log.d(TAG, 
“finishedCallback“);
            Message msg 
= mCallback.obtainMessage(TASK_FINISHED, this);
            mCallback.sendMessage(msg);
            mCallback 
= null;
        }
    }
   
    
public synchronized void cancel() {

        mIsCanceled 
= true;
    }
   
    
public synchronized boolean isCanceled() {

        
return mIsCanceled;
    }
   
    
protected void setError(int code, String msg) {

        mErrorCode 
= code;
        mErrorMsg 
= msg;
    }
   
    
public int getErrorCode() {

        
return mErrorCode;
    }
   
    
public String getErrorMsg() {

        
return mErrorMsg;
    }
   
    
public String formatErrMsg() {

        
return “” + mErrorMsg + “(“ + mErrorCode + “)“;
    }
   
    
public Handler getCallbackHandler() {

        
return mCallback;
    }
    
public int getTaskType()
    {

        
return mTaskType;
    }
    
public void setTaskType(int type){

        mTaskType
=type;
    }
   
    
public void run() {

    }

}

//TaskManager负责创建Task,管理Task

ContractedBlock.gif
ExpandedBlockStart.gif
Code

public abstract class AbstractTask implements Runnable {

    
private final static String TAG = “AbstractTask“;
   
    
public final static int TASK_FINISHED = 1000;
   
    
protected Context mContext = null;
    
protected Handler mCallback = null;
    
private boolean mIsCanceled = false;
    
private int mTaskType=0;
   
    
public final static int ERROR_NO_ERROR = 0;
    
public final static int ERROR_FAILED = 1;
    
public final static int ERROR_RESPONSE_XML = 1000;
    
public final static int ERROR_RESQUEST_XML = 1001;
   
    
public final static int RESPONSE_STATUS_SUCCESS = 0;
   
    
protected int mErrorCode = ERROR_NO_ERROR;
    
protected String mErrorMsg = “”;
   
    
public AbstractTask(Context context, Handler callback) {

        mContext 
= context;
        mCallback 
= callback;
    }
   
    
protected synchronized void finishedCallback() {

        
if (null != mCallback && !isCanceled()) {

            Log.d(TAG, 
“finishedCallback“);
            Message msg 
= mCallback.obtainMessage(TASK_FINISHED, this);
            mCallback.sendMessage(msg);
            mCallback 
= null;
        }
    }
   
    
public synchronized void cancel() {

        mIsCanceled 
= true;
    }
   
    
public synchronized boolean isCanceled() {

        
return mIsCanceled;
    }
   
    
protected void setError(int code, String msg) {

        mErrorCode 
= code;
        mErrorMsg 
= msg;
    }
   
    
public int getErrorCode() {

        
return mErrorCode;
    }
   
    
public String getErrorMsg() {

        
return mErrorMsg;
    }
   
    
public String formatErrMsg() {

        
return “” + mErrorMsg + “(“ + mErrorCode + “)“;
    }
   
    
public Handler getCallbackHandler() {

        
return mCallback;
    }
    
public int getTaskType()
    {

        
return mTaskType;
    }
    
public void setTaskType(int type){

        mTaskType
=type;
    }
   
    
public void run() {

    }

}

//在UI主线程里,启动一个请求Task,

        Task mTask = new DemoTask(mContext, mHandler);

        TaskManager.getInstance().startTask(mTask);

下面是负责在Task与UI主进程交互的Handler

    private final Handler mHandler = new Handler() {     //创建一个Android Handler

         @Override

          public void handleMessage(final Message msg) {

           switch(msg.what) {

                case AbstractTask.TASK_FINISHED:

                  DemoTask task = (DemoTask) msg.obj;//在Handler内部来处理刷新UI

            

         }

};

转载于:https://www.cnblogs.com/abob/archive/2009/06/16/1504389.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110899.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • pve虚拟机单网口(虚拟机做软路由)

    PVE虚拟网口扩展实现一线多拨PVE网口设置可以看到这里有两个物理网口我的物理网口enp3s0没有对应的vmbr1,需要先创建LinuxBridge,步骤如下:ROS虚拟网口设置这是关键一步,需要创建四个虚拟网口对应一个LAN口设置四个虚拟网口,完成如下:完成!…

    2022年4月16日
  • sonar.exclusions 配置如何生效

    sonar.exclusions 配置如何生效1、sonar.exclusions后配置一定要用**/*Criss*.java格式完成配置2、多个类需要用英文逗号分隔

    2022年11月1日
  • maven中的groupId和artifactId到底指的是什么?「建议收藏」

    ———2017.12.01修改———-下面标黄的位置应该修改为cn.snowin.testProj,感谢网友xiaoqidela指出。—————原文——————-转载自百度知道一位网友的回答(略修改)地址:https://zhidao.baidu.com/question/1639120287056394340.h…

    2022年4月18日
  • vmware虚拟机连接网络[通俗易懂]

    vmware虚拟机连接网络[通俗易懂]当安装好vm虚拟机后,进入系统,发现打开无法打开网页,可参考如下步骤进行配置1.vm打开虚拟及设置,选择网络适配器,网络连接选择自定义,VMnet8(NAT模式)2.vm虚拟机打开编辑->虚拟网络编辑器,选择VMnet8,虚拟机会自动分配子网IP3.打开网络和共享中心(win10为例)4.启动虚拟机,即可上网…

    2022年6月15日
  • python控制mt4自动交易软件_实用MT4快速操作脚本汇总(附源代码)[通俗易懂]

    python控制mt4自动交易软件_实用MT4快速操作脚本汇总(附源代码)[通俗易懂]安装使用脚本必做下面2个步骤,否则一定出问题。快照1.gif(9.39KB,下载次数:523)2012-12-1715:19上传快照2.gif(10KB,下载次数:496)2012-12-1715:24上传快照3.gif(10.25KB,下载次数:509)2012-12-1715:24上传1.MT4平台信息探测脚本:MT4平台信息探测脚本.mq4(3.03K…

    2022年5月30日
  • 密码暴力激活成功教程与防御

    密码暴力激活成功教程与防御密码暴力激活成功教程与防御密码安全概述漏洞利用权限管理不安全的密码默认密码弱口令裤子密码猜解思路字典专门字典python暴力激活成功教程BurpSuite暴力激活成功教程LowMediumHighBp其他攻击模式Impossible如何防御暴力激活成功教程其他暴力激活成功教程工具wfuzzpiachuHydraMudusaMSF密码安全概述加密、完整性、身份认证存储安全、传输安全、输入安全漏洞利用从数据库获取密码窃听通信数据直接从登录框猜测数据权限管理认证:你是谁?授权:你能做什么?不安全的密码默认密码0000001

    2022年8月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号