文档章节

Android也架构之二:单例模式访问网络

理工男海哥
 理工男海哥
发布于 2012/08/19 18:15
字数 812
阅读 915
收藏 4

oschina中没有代码插入,看带有代码的文章挺费劲的,如果你和我一样

请移步:http://blog.csdn.net/michael_yy/article/details/7883621  或者我的个人网站 http://www.devchina.com

首先我们来看下单例模式的定义:

定义:在整个应用中,保证一个类只有一个实例,它提供了一个可以访问到它自己的全局访问点(静态方法)。

单例模式中有区分了懒汉式和饿汉式,懒汉式主要是用时间来换空间,饿汉式则是用空间来换时间。饿汉式是线程安全的,懒汉式是非线程安全的,如果要实现懒汉式的非线程安全,则可以再访问点添加synchronized关键字声明即可。在其他的一些项目中还使用了双重检测枷锁机制。

现在我们来看下代码,我会提供代码下载供大家参考。

AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.yangfuhai.singleton"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk android:minSdkVersion="8" />


    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name" >

        <activity

            android:name=".SingletonActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>


    <uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

</manifest>


注意添加:

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


用于访问网络

activity代码 SingletonActivity

package com.yangfuhai.singleton;


import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;


/**

 * @title 单例模式

 * @description 单例模式

 * @company 探索者网络工作室(www.tsz.net)

 * @author michael Young (www.YangFuhai.com)

 * @version 1.0

 * @created 2012-8-19

 */

public class SingletonActivity extends Activity {

TextView mTv;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mTv = (TextView) findViewById(R.id.textView);

        

        mTv.setText("正在加载www.devchina.com数据。。。");

        new Thread(new Runnable() {

@Override

public void run() {

final String strContext = HttpUtils.get().getUrlContext("http://www.devchina.com");

runOnUiThread(new Runnable() {

@Override

public void run() {

if(strContext!=null)

mTv.setText(strContext);

else

mTv.setText("加载失败。。。");

}

});

}

}).start();

        

    }

    

    

}



http访问网络代码HttpUtils,用单例模式实现

package com.yangfuhai.singleton;


import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.Reader;

import java.io.UnsupportedEncodingException;

import java.net.HttpURLConnection;

import java.net.URL;


import android.util.Log;


/**

 * @title Http请求工具类

 * @description 请求http数据,单例模式

 * @company 探索者网络工作室(www.tsz.net)

 * @author michael Young (www.YangFuhai.com)

 * @version 1.0

 * @created 2012-8-19

 */

public class HttpUtils {

private static final String DEBUG_TAG = "HttpUtils";

private HttpUtils() {} //单例模式中,封闭创建实例接口

private static HttpUtils httpUtils = null; 

//提供了一个可以访问到它自己的全局访问点

public static HttpUtils get(){

if(httpUtils == null)

httpUtils = new HttpUtils();

return httpUtils;

}

/**

* 获取某个url的内容

* @param strUrl

* @return

*/

public String getUrlContext(String strUrl){

InputStream is = null;

   int len = 500;

       

   try {

       URL url = new URL(strUrl);

       HttpURLConnection conn = (HttpURLConnection) url.openConnection();

       conn.setReadTimeout(10000 /* milliseconds */);

       conn.setConnectTimeout(15000 /* milliseconds */);

       conn.setRequestMethod("GET");

       conn.setDoInput(true);

       conn.connect();

       int response = conn.getResponseCode();

       Log.d(DEBUG_TAG, "The response is: " + response);

       is = conn.getInputStream();

       

       //这里指获取了500(len=500)字节,如果想

       //整个网页全部获取可以用conn.getContentLength()来代替len

       String contentAsString = readInputStream(is, len);

       return contentAsString;

      

   } catch (Exception e) {

    e.printStackTrace();

   } finally {

       if (is != null) {

           try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

       } 

   }

   return null;

}

/**

* 读取 InputStream 内容

* @param stream

* @param len

* @return

* @throws IOException

* @throws UnsupportedEncodingException

*/

public String readInputStream(InputStream stream, int len) throws IOException, UnsupportedEncodingException {

   Reader reader = null;

   reader = new InputStreamReader(stream, "UTF-8");        

   char[] buffer = new char[len];

   reader.read(buffer);

   return new String(buffer);

}


}

源码下载地址:

http://download.csdn.net/detail/michael_yy/4511109

大家多多指教,转载请注明来之 www.devchina.com  或者 csdn, 谢谢。

谢谢大家关注,我继续在博客中讲解了经典的23中模式中在android实际项目中灵活运用,下一篇 《Android也架构之三:简单工厂模式优化网络请求》敬请关注。

© 著作权归作者所有

共有 人打赏支持
理工男海哥

理工男海哥

粉丝 882
博文 38
码字总数 37803
作品 5
昌平
其他
私信 提问
加载中

评论(1)

亭子happy
亭子happy
oschina有代码插入
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 Android 网络编程2 Okhttp缓存机制 Android 网络编程3 Java NIO to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图...

香沙小熊
2018/06/21
0
0
[Andriod设计模式之旅]——Builder模式

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/78764592 前言 具体介绍Builder设计模式之前,首先我们...

紫雾凌寒
2017/12/10
0
0
移动开发之设计模式- 代理模式(IOS&Android)

资源 完全参照 代理模式|菜鸟教程但不包括IOS代码 代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有...

FlanneryZJ
2018/12/18
0
0
Android也架构之三:简单工厂模式优化网络请求

很悲催,我们在《Android也架构之二:单例模式访问网络》 用httpConnect的方式去访问网络,而且能够正常获取数据了,可是老板能,技术出生,他要求我重新用httpClient去获取获取网络数据,童...

理工男海哥
2012/08/21
0
0
Android程序员需要了解多少Java设计模式,Android应用经常使用的设计模式是什么?

Android程序员需要了解多少Java设计模式,Android应用经常使用的设计模式是什么? 熟悉Java设计模式、Android系统框架及相关SDK; 3、有丰富的开发经验,熟悉Android各种软件环境的特性; 4、能...

天池番薯
2015/04/24
66
0

没有更多内容

加载失败,请刷新页面

加载更多

域名重定向、用户认证

域名重定向 什么是域名重定向 域名重定向是通过设置web服务的配置文件,将原本访问A域名的请求访问到B域名。 为什么要做域名重定向? 一个比较简单的例子:之前做了一个网站,域名又长又复杂...

李超小牛子
31分钟前
2
0
jvm

public class Demo {    /**     * 成员变量(俗称全局变量),//有缺省值为0     *      静态变量(也称类变量),带static的     *      实例变量...

废柴
47分钟前
0
0
【Mysql技术内幕】第3章 文件

第3章 文件 3.1 参数文件 mysql 数据库的参数文件是以文本的形式进行存储的,可以用vim进行修改 my.ini my.conf等 3.1.1 什么是参数 SHOW VARIABLES 可以查看mysql 配置参数 3.1.2 参数类型 ...

HOT_POT
今天
0
0
Java8 如何正确使用 Optional

原文链接:https://blog.kaaass.net/archives/764 Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。这篇文章是建立在...

大灰狼时间
今天
5
0
富兰克林的人生信条

春节假期期间读了富兰克林自传,这位饱经风霜的老人出身贫寒,只读过两年书,但是通过刻苦自学和不懈奋斗还是取得了令人难以置信的成就,他的一生可以作为我们普通人的励志典范。 富兰克林 ...

春哥大魔王的博客
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部