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

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

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

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


相关推荐

  • 三立[通俗易懂]

    三立[通俗易懂]自传173、在佳木斯上网写作2013年1—-互动百科二零一三年一月起,我在佳木斯市的上网写作进入了第七年时间,钰香妻在市健身房练打乒乓球,照看外孙女和管理家务吃喝用穿。大女儿女婿在厦门外国语学校,二女儿女婿在本市文化公司上班。儿子在大连工业大学,儿媳在大连银行,孙女在北京上大学二年。2013、1、1星期二写《新年(七古)》:平平静静日历翻,新页…

    2022年5月4日
    70
  • hibernate与mybatis的区别比较_mybatis中

    hibernate与mybatis的区别比较_mybatis中为方便以后准备面试,把一些常用的技术整理出来,会不定期更新。首先简单介绍下两者的概念:Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装。Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。下面具体从几个方面说一下两者的区别:1.两者最大的区

    2025年10月20日
    3
  • 异或满足结合律吗_异或1⊕0的结果是

    异或满足结合律吗_异或1⊕0的结果是给定一个非负整数序列 a,初始长度为 N。有 M 个操作,有以下两种操作类型:A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N 增大 1。Q l r x:询问操作,你需要找到一个位置 p,满足 l≤p≤r,使得:a[p] xor a[p+1] xor … xor a[N] xor x 最大,输出这个最大值。输入格式第一行包含两个整数 N,M,含义如问题描述所示。第二行包含 N 个非负整数,表示初始的序列 A。接下来 M 行,每行描述一个操作,格式如题面所述。输出格式每个询问操

    2022年8月9日
    5
  • Codeforces Round #256 (Div. 2/B)/Codeforces448B_Suffix Structures(字符串处理)

    Codeforces Round #256 (Div. 2/B)/Codeforces448B_Suffix Structures(字符串处理)

    2021年12月1日
    73
  • 2013年蓝桥杯真题[通俗易懂]

      1.某人年龄的立方是4位数,年龄的四次方是6位数,这10位数包含0到9,每个恰好出现一次,求他年龄多大publicclassOne{publicstaticvoidmain(String[]args){for(inti=10;i<100;i++){inti1=i*i*i;int…

    2022年4月12日
    44
  • Java配置环境变量

    Java配置环境变量Java配置环境变量要想配置环境变量先要下载好JDK点击这里可以下载可以通过鼠标下滑找到以前的版本,网页最前面的部分是最新版本,一般来说用的都是jdk1.8这个版本。点击箭头位置下载根据自己需要下载,如何知道自己是x86还是x64呢?windows电脑右键点击此电脑—>属性知道了这个,就可以点进去下载了!如果需要账户就创建账户,然后就可以下载了,因为步骤简单,不放出来了!好的,现在默认JDK已经下好了,但是笔者的JDK版本不一致,但是配置环境变量是一样的下载好之后会得到这样

    2022年6月12日
    23

发表回复

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

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