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(
1Invalid 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(cookiethis.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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 使用phpmaill发送邮件的例子

    使用phpmaill发送邮件的例子

  • HashMap遍历的五种方法「建议收藏」

    HashMap遍历的五种方法「建议收藏」HashMap遍历的五种方法

  • React 动态菜单-不限级递归菜单树

    React 动态菜单-不限级递归菜单树import{FC,useState}from”react”;import{Layout,Menu}from’antd’;import{Link}from’react-router-dom’import{getData}from”../../mock-data”;const{Header,Content,Footer,Sider}=Layout;//菜单数据结构typeMenuData={id:number,name:.

  • 自动化运维平台(后端python+django)「建议收藏」

    自动化运维平台(后端python+django)「建议收藏」Django的MTV模式Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:M代表模型(Model):负责业务对象和数据库的关系映射(ORM)。T代表模板(Template):负责如何把页面展示给用户(html)。V代表视图(View):负责业务逻辑,并在适当时候调用Model和Tem…

  • ANSI编码表_ansi配列

    ANSI编码表_ansi配列在日常开发中,在思考一个问题,为什么是英文来编程,结果ASCII这个玩意在处理。ASCII,AmericanStandardCodeforInformationInterchange念起来像是”阿斯key”,定义从0到127的一百二十八个数字所代表的英文字母或一样的结果与意义。由于只使用7个位元(bit)就可以表示从0到127的数字,大部分的电脑都使用8个位元来存取字元集(characterset),所以从128到255之间的数字可以用来代表另一组一百二十八个符号,称…

  • pycharm远程部署_pycharm 远程调试

    pycharm远程部署_pycharm 远程调试在这之前你要确保服务器上已经创建好虚拟环境你本地已经安装好pycharm1创建本地文件远程服务器上已经有一个文件了。现在你在本地创建一个同名文件。服务器上的虚拟环境为DrQA,所以我在本地新建一个DrQA空文件夹。2用pycharm打开空项目3配置服务器的解释器左上角File→Setting→projectxxx→pythoninterpreter点右上角的小齿轮,然后点add选择SSHInterpreter,然后在上边填上服务器的地址、usernam

    2022年10月29日

发表回复

您的电子邮箱地址不会被公开。

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