哲学原理Android网络要心路历程

by admin on 2018年9月25日

纱要是android客户端非常重点之一对。下面从入门级开始介绍下好Android网络要的实践过程。希望能被正接触Android网络有的恋人有协助。
正文包含:

1. Core Image

作规划及体会者的经营管理者,苹果好对图片效果和图片处理的支持一定是老大好之,在iOS平台上,5.0从此就是涌出了Core
Image的API。Core Image的API被在CoreImage.framework库中。

每当iOS和OS X平台上,Core Image都提供了大量的滤镜(Filter),这为是Core
Image库中较基本的事物有。按照合法文档记载,在OS
X上起120几近栽Filter,而当iOS上吗起90多。

脚是一致截Core Image做模糊的以身作则代码:

 CIContext *context = [CIContext contextWithOptions:nil];
 CIImage *image = [CIImage imageWithContentsOfURL:imageURL];
 CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
 [filter setValue:image forKey:kCIInputImageKey];
 [filter setValue:@2.0f forKey: @"inputRadius"];
 CIImage *result = [filter valueForKey:kCIOutputImageKey];
 CGImageRef outImage = [context createCGImage: result fromRect:[result extent]];
 UIImage * blurImage = [UIImage imageWithCGImage:outImage];

这里可以见见,Core
Image为了开得较灵活,Filter都是按部就班字符串的名去创造的,比如高斯歪曲滤镜就是“CIGaussianBlur”,这里发生一个列表可以参照:
https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html\#//apple\_ref/doc/filter/ci/CIGaussianBlur

除去这里提到的又Filter之外,Core
Image还提供了CIDetector等相近,可以支持人口脸识别等,在OS X上Core
Image也开了更多支持。

HTTP缓存机制

缓存对于移动端是大重大的存在。

  • 削减请求次数,减多少服务器压力.
  • 地面数据读取速度更快,让页面不会见空白几百毫秒。
  • 以管网的状下提供数据。

缓存一般由服务器控制(通过某些方式可以本地控制缓存,比如为过滤器添加缓存控制信息)。通过以呼吁头上加下面几乎独字端:

Request

请求头字段 意义
If-Modified-Since: Sun, 03 Jan 2016 03:47:16 GMT 缓存文件的最后修改时间。
If-None-Match: "3415g77s19tc3:0" 缓存文件的Etag(Hash)值
Cache-Control: no-cache 不使用缓存
Pragma: no-cache 不使用缓存

Response

响应头字段 意义
Cache-Control: public 响应被共有缓存,移动端无用
Cache-Control: private 响应被私有缓存,移动端无用
Cache-Control:no-cache 不缓存
Cache-Control:no-store 不缓存
Cache-Control: max-age=60 60秒之后缓存过期(相对时间)
Date: Sun, 03 Jan 2016 04:07:01 GMT 当前response发送的时间
Expires: Sun, 03 Jan 2016 07:07:01 GMT 缓存过期的时间(绝对时间)
Last-Modified: Sun, 03 Jan 2016 04:07:01 GMT 服务器端文件的最后修改时间
ETag: "3415g77s19tc3:0" 服务器端文件的Etag[Hash]值

业内以时本需要或只是含其中有些字段。
客户端要因这些消息存储这次要信息。
然后以客户端发起呼吁的时节要反省缓存。遵循下面步骤:

浏览器缓存机制

留神服务器返回304意是数据尚未改动滚去读缓存信息。
早已年轻的本身耶协调写的网络要框架添加到了缓存机制,还美,直到有一样天自己见状了下面2只东西。(/TДT)/

3. vImage

实际上,说了上面的Core
Image和GPUImage,很多情下就是已足足用了。下面我们又来拘禁一个,那便是vImage。vImage也是苹果推出的仓库,在Accelerate.framework中。

Accelerate这个framework主要是故来开数字信号处理、图像处理相关的通往量、矩阵运算的仓库。我们可以当咱们的图像都是由于向量或者矩阵数据整合的,Accelerate里既是提供了迅速之数学运算API,自然就是会利我们本着图像做各种各样的拍卖。

因vImage我们可以依据图像的拍卖原理直接开模糊效果,或者采用现有的家伙。UIImage+ImageEffects是个深好的图像处理库,看名字吧掌握凡是针对性UIImage做的归类扩展。这个家伙被广大地运在。

图形管理方案

再则说图片存储。不要在好服务器上面,徒增流量压力,还从来不图处理功能。
推荐七牛与阿里云存储(没因此过任何
π__π
)。它们还产生老重要之一律件图片处理。在图片Url上长参数来针对图片进行一些拍卖还传。
于是(七牛之处理代码)

    public static String getSmallImage(String image){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+IMAGE_SIZE_SMALL;
        return image;
    }

    public static String getLargeImage(String image){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+IMAGE_SIZE_LARGE;
        return image;
    }

    public static String getSizeImage(String image,int width){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+width;
        return image;
    }

既然如此好加速请求速度,又会减小流量。再配合Fresco或Glide。完美的图形加载方案。
唯独当下就算待您将拥有图片都存放于七牛要阿里云,这样啊是。

图形/文件上传也还是下其第三正存储,它们还有SDK与合法文档教你。
但图片一定要缩减了后上传。上传1-2M大的高清照片没有意义。

本篇文章主要是本着以iOS上举行半透明模糊效果的支出实现做整理。

Get&Post

网络请求惨遭我们常因此键值对来导参数(少部分api用json来传递,毕竟非是主流)。
透过地方的介绍,可以看出虽然Post与Get本意一个凡表单提交一个是要页面,但本质并不曾什么分别。下面说说参数在马上2者的位置。

  • Get方式
    于url中填入参数:

      http://xxxx.xx.com/xx.php?params1=value1&params2=value2
    

还是用路由

    http://xxxx.xx.com/xxx/value1/value2/value3

这些就是是web服务器框架的事了。

  • Post方式
    参数是经编码在请求体中的。编码包括x-www-form-urlencoded
    form-data
    x-www-form-urlencoded的编码方式是如此:
    tel=13637829200&password=123456
    form-data的编码方式是这般:
    —-WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”tel”

      13637829200
      ----WebKitFormBoundary7MA4YWxkTrZu0gW
      Content-Disposition: form-data; name="password"
    
      123456
      ----WebKitFormBoundary7MA4YWxkTrZu0gW
    

x-www-form-urlencoded的优越性就死明白了。不过x-www-form-urlencoded唯其如此传键值对,但是form-data足传二进制

盖url是在被要求行中之。
故此Get与Post区别本质就是参数是放在请求行被或者放在请求体
自然无论用啊种都能放在请求头遇。一般以恳求求头中放大有殡葬端的常量。

有人说:

  • Get是明文,Post隐藏
    倒端不是浏览器,不用https全都是堂而皇之。
  • Get传递数据上限XXX
    胡说。有限量的是浏览器中之url长度,不是Http协议,移动端请求无影响。Http服务器部分来限定的设置一下即可。
  • Get中文需要编码
    是真的…要注意。URLEncoder.encode(params, "gbk");

要建议用post规范参数传递方式。并没有啊还优良,只是大家都这样社会再次和谐。

点说之是要。下面说响应。
告是键值对,但回到数据我们经常因此Json。
对此内存中的结构数据,肯定使用多少描述语言将对象序列化成文本,再就此Http传递,接收端并起文本还原成结构数据。
对象(服务器)<–>文本(Http传输)<–>对象(移动端) 。

服务器返回的数目大部分都是繁体的结构数据,所以Json最适合。
Json解析库有多Google的Gson,阿里的FastJson。
Gson的用法看这里。

虽iOS很已经支持以模糊效果指向图片等开展处理,但更是以iOS7以后,半透明模糊效果得到好范围大利用。包括今年风行通告之iOS8为传了当时无异于计划,甚至以OS
X 10.10版本Yosemite中吗起大量运半晶莹剔透模糊。

同步&异步

当即2个概念才存在吃多线程编程中。
android中默认只出一个主线程,也于UI线程。因为View绘制只能于这个线程内开展。
据此如果您死了(某些操作而之线程在此间运行了N秒)这个线程,这之间View绘制将非可知开展,UI就见面卡。所以如果全力以赴避免以UI线程进行耗时操作。
网要是一个天下无双耗时操作。
由此者的Utils类进行网络要单生一行代码。

NetUtils.get("http://www.baidu.com");//这行代码将执行几百毫秒。

一旦你如此写

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String response = Utils.get("http://www.baidu.com");
    }

就会死。。
就便是一块方式。直接耗时操作阻塞线程直到数据接收了毕然后归来。Android不允许的。
异步方式:

         //在主线程new的Handler,就会在主线程进行后续处理。
    private Handler handler = new Handler();
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                    //从网络获取数据
                final String response = NetUtils.get("http://www.baidu.com");
                    //向Handler发送处理操作
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                            //在UI线程更新UI
                        textView.setText(response);
                    }
                });
            }
        }).start();
    }

于子线程进行耗时操作,完成后经过Handler将更新UI的操作发送到主线程执行。这便叫异步。Handler是一个Android线程模型中关键的事物,与网无关便不说了。关于Handler不了解就优先夺Google一下。
关于Handler原理同首对的稿子

而是这样勾画好丢人。异步通常伴随者他的好基友回调
马上是经回调封装的Utils类。

    public class AsynNetUtils {
        public interface Callback{
            void onResponse(String response);
        }

        public static void get(final String url, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.get(url);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            }).start();
        }

        public static void post(final String url, final String content, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.post(url,content);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            }).start();
        }
    }

接下来利用方式。

    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.webview);
        AsynNetUtils.get("http://www.baidu.com", new AsynNetUtils.Callback() {
            @Override
            public void onResponse(String response) {
                textView.setText(response);
            }
        });

举凡休是雅很多。
啊,一个笨到哭的网络要方案成型了。
懵的地方来广大:

  • 每次都new Thread,new Handler消耗了大
  • 从未特别处理体制
  • 从未有过缓存机制
  • 尚未周全之API(请求头,参数,编码,拦截器等)与调试模式
  • 没有Https

每当iOS开发中,我们发出为数不少增选得开半晶莹剔透模糊效果,下面就是是局部广大的主意或说工具。

  • HTTP请求&响应
  • Get&Post
  • [HttpClient & HttpURLConnection](#HttpClient & HttpURLConnection)
  • 同步&异步
  • HTTP缓存机制
  • Volley&OkHttp
  • Retrofit&RestAPI
  • 网图片加载优化
  • Fresco&Glide
  • 图管理方案

4. 性能及择

既然如此已明白了3单道好半晶莹剔透模糊效果,那么我们而为此之下该选哪位也?这是单问题。

  • 由网版本的支撑上来拘禁,这几只都多,都是iOS4、iOS5纵支持了之,对于身在iOS8时代的开发者,这点配合已经够用了。
  • Core
    Image是苹果好的图像处理库,本来就正确,如果苹果自身在某个版本做了优化处理,自然又好。主要是为此起较麻烦,还要亮Filter的名字。
  • GPUImage来自第三正值,但落实开放,用起来呢比较简单,在诸多面貌下是出于Core
    Image的挑三拣四。
  • 图像模糊处理是充分复杂的精打细算,最终往往使看性。这点达看,我重新倾向选择vImage。

当自身支付的iOS应用被,选择了vImage,出发点是性质,这并无是说生那个准确的benchmark。但以几个调剂时的主流机型上测,包括5c、5s等,在模糊半径(blur
radius)达到10左右底上,配合动画,vImage的拍卖时会明显较短缺,不见面“卡顿”。

如上是我对iOS上落实半晶莹剔透模糊效果实现的整。

参考:

  • http://boboshone.com/blog/2013/04/22/blur-effect-in-ios/
  • http://nshipster.com/gpuimage/
  • http://blog.denivip.ru/index.php/2013/01/blur-effect-in-ios-applications/?lang=en
  • http://code.tutsplus.com/tutorials/adding-blur-effects-on-ios–cms-21488

转载自:http://www.molotang.com/articles/1921.html

Fresco&Glide

匪用想啊亮堂她都召开了杀健全的优化,重复过去轮子的行充分愚蠢。
Fresco是Facebook公司的非法科技。光看作用介绍就看非常强劲。使用方式官方博客说的足够详细了。
审三级缓存,变换后底BItmap(内存),变换前的本来面目图片(内存),硬盘缓存。
以内存管理及成功了最为。对于重度图片应用的APP应该是非常好之。
她一般是直接以SimpleDraweeView来替换ImageView,呃~侵入性较强,依赖上她apk包直接生1M。代码量惊人。

用我再也爱Glide,作者是bumptech。这个库房被普遍的采用在google的开源项目面临,包括2014年google
I/O大会上披露的官方app。
这里产生详实介绍。直接运用ImageView即可,无需初始化,极简的API,丰富的拓,链式调用都是本人喜欢的。
长的开展指的虽是这个。
除此以外自为因此了Picasso。API与Glide简直一模一样,功能略少,且发生一半年不修复的BUG。

2. GPUImage

除苹果官方提供的外围,第三正为生及时上头图片处理的家伙。一个吃Brad
Larson的兄长就弄了一致仿照叫做GPUImage的开源库。同样的,里面提供了无数Filter。

https://github.com/BradLarson/GPUImage

同样是召开高斯模糊,用GPUImage可以如此:

 GPUImageGaussianBlurFilter * blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
 blurFilter.blurRadiusInPixels = 2.0;
 UIImage * image = [UIImage imageNamed:@"xxx"];
 UIImage *blurredImage = [blurFilter imageByFilteringImage:image];

至少看起,代码上比较采用Core Image的状略得几近。

Volley&OkHttp

Volley&OkHttp应该是今天最常用底网络要求库。用法也很相像。都是因此构造请求在请求队列的道管理网络请求。

先说Volley:
Volley可以通过这个库进展依赖.
Volley在Android 2.3以及以上版本,使用的凡HttpURLConnection,而当Android
2.2与以下版本,使用的凡HttpClient。
Volley的主干用法,网上资料无数,这里推荐郭霖大神的博客
Volley存在一个缓存线程,一个网络请求线程池(默认4个线程)。
Volley这样一直用出效率会较小,我将本身用Volley时的各种技术封装成了一个储藏室RequestVolly.
自以这库房中将构造请求的点子封装为了函数式调用。维持一个大局的呼吁队列,拓展一些便利的API。

然又怎么封装Volley在效能拓展性上总无法和OkHttp相比。
Volley停止了翻新,而OkHttp得到了官方的肯定,并在连优化。
为此自最终替换为OkHttp

OkHttp用法见这里
杀友好之API与详尽的文档。
立马篇稿子呢刻画的老详细了。
OkHttp使用Okio进展多少传。都是Square家的。
只是连无是一直用OkHttp。Square公司还来了一个Retrofit库配合OkHttp战斗力翻倍。

HTTP请求&响应

既说于入门级开始便说说Http请求包的构造。
同样不好呼吁虽是向阳目标服务器发送一串文本。什么样的文书?有脚结构的文本。
HTTP请求保管结构

请求包

例子:

    POST /meme.php/home/user/login HTTP/1.1
    Host: 114.215.86.90
    Cache-Control: no-cache
    Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed
    Content-Type: application/x-www-form-urlencoded

    tel=13637829200&password=123456

请了就见面接到响应包(如果对面有HTTP服务器)
HTTP响应包结构

响应包

例子:

    HTTP/1.1 200 OK
    Date: Sat, 02 Jan 2016 13:20:55 GMT
    Server: Apache/2.4.6 (CentOS) PHP/5.6.14
    X-Powered-By: PHP/5.6.14
    Content-Length: 78
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: application/json; charset=utf-8

    {"status":202,"info":"\u6b64\u7528\u6237\u4e0d\u5b58\u5728\uff01","data":null}

Http请求方式发出

方法 描述
GET 请求指定url的数据,请求体为空(例如打开网页)。
POST 请求指定url的数据,同时传递参数(在请求体中)。
HEAD 类似于get请求,只不过返回的响应体为空,用于获取响应头。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

常用只有Post与Get。

Retrofit&RestAPI

Retrofit巨的简化了网络要的操作,它当说只有是一个Rest
API管理库,它是直采用OKHttp进行网络要并无影响您针对OkHttp进行安排。毕竟都是Square公司出品。
RestAPI是平种软件设计风格。
服务器作为资源存放地。客户端去要GET,PUT,
POST,DELETE资源。并且是无论状态的,没有session的插手。
挪动端和服务器交互最重点之饶是API的计划性。比如就是一个正规的记名接口。

Paste_Image.png

你们当看的起这个接口对应之求保管跟响应包约是啊体统吧。
求方式,请求参数,响应数据,都充分清楚。
采用Retrofit这些API可以直观的体现于代码中。

Paste_Image.png

然后下Retrofit提供被您的是接口的兑现类
就能一直进行网络要获得结构数据。

在意Retrofit2.0相较1.9开展了大气免配合更新。google上绝大多数课程都是根据1.9的。这里有个2.0的教程。

课里展开异步请求是下Call。Retrofit最精的地方在于支持RxJava。就如我上图备受归的是一个Observable。RxJava上亲手难度比大,但用了就算再为离开不开了。Retrofit+OkHttp+RxJava配合框架打来成吨的出口,这里不再多说。

纱要学习到此处自己认为都交到了。。

三级缓存

网上经常说三级缓存--服务器,文件,内存。不过自己当服务器不算是一级缓存,那就算是数码源嘛。

  • 外存缓存
    率先内存缓存使用LruCache。LRU是Least Recently Used
    近期最少使用算法,这里确定一个大大小小,当Map里对象大小总和超此充分时将采用效率低于的靶子释放。我以内存大小限制也经过可用内存的1/8.
    内存缓存里读博的数量就是直接返回,读不交之为硬盘缓存要多少。

  • 硬盘缓存
    硬盘缓存使用DiskLruCache。这个仿佛非在API中。得复制利用。
    映入眼帘LRU就掌握了吧。我用硬盘缓存大小设置为100M。

      @Override
      public void putBitmap(String url, Bitmap bitmap) {
          put(url, bitmap);
          //向内存Lru缓存存放数据时,主动放进硬盘缓存里
          try {
              Editor editor = mDiskLruCache.edit(hashKeyForDisk(url));
              bitmap.compress(Bitmap.CompressFormat.JPEG, 100, editor.newOutputStream(0));
              editor.commit();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
    
      //当内存Lru缓存中没有所需数据时,调用创造。
      @Override
      protected Bitmap create(String url) {
          //获取key
          String key = hashKeyForDisk(url);
          //从硬盘读取数据
          Bitmap bitmap = null;
          try {
              DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key);
              if(snapShot!=null){
                  bitmap = BitmapFactory.decodeStream(snapShot.getInputStream(0));
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
          return bitmap;
      }
    

DiskLruCache的原理不再说了(我还缓解了它们是的一个BUG,向Log中长的数增删记录时,最后一漫漫没有出口,导致最后一修缓存一直失效。)

  • 硬盘缓存也未曾数据就回去空,然后就于服务器请求数据。

立刻就算是百分之百流程。
可是本身如此的拍卖方案或产生许多受制。

  • 图片未经压缩处理直接存储使用
  • 文件操作以主线程
  • 从来不完善的图纸处理API

早先也看这样已经够好直到我遇上下面俩。

网络图片加载优化

对图片的导,就像面的登录接口的avatar字段,并无会见一直将图纸写以回去内容里,而是受一个图纸的地址。需要时又错过加载。

使您一直用HttpURLConnection去获取一摆图,你办获得,不过尚未优化就惟有是个BUG不断demo。绝对不能够正式以。
留神网络图片有些特点:

  1. 它们世代不见面变
    一个链接对应的图片一般永远不见面转换,所以当第一差加载了图时,就该予以永久缓存,以后就是不再网要。

  2. 她非常占内存
    同样摆设图小的几十k多的几M高清无码。尺寸也是64*64届2k图。你无可知不怕如此直白展示到UI,甚至不克直接放大上内存。

  3. 它们如果加载很悠久
    加载一摆图纸需要几百ms到几m。这中间的UI哲学原理占个图功能也是须考虑的。

说说自在地方提到的RequestVolley里开的图请处理(没错我举行了,这有些之代码可以去github里看源码)。

HttpClient & HttpURLConnection

HttpClient早于抛了,谁又好这种题材吗只有经历落后的面试官才见面问。具体由可以扣押这里。

下面说说HttpURLConnection的用法。
最开始接触的饶是这个。

    public class NetUtils {
        public static String post(String url, String content) {
            HttpURLConnection conn = null;
            try {
                // 创建一个URL对象
                URL mURL = new URL(url);
                // 调用URL的openConnection()方法,获取HttpURLConnection对象
                conn = (HttpURLConnection) mURL.openConnection();

                conn.setRequestMethod("POST");// 设置请求方法为post
                conn.setReadTimeout(5000);// 设置读取超时为5秒
                conn.setConnectTimeout(10000);// 设置连接网络超时为10秒
                conn.setDoOutput(true);// 设置此方法,允许向服务器输出内容

                // post请求的参数
                String data = content;
                // 获得一个输出流,向服务器写数据,默认情况下,系统不允许向服务器输出内容
                OutputStream out = conn.getOutputStream();// 获得一个输出流,向服务器写数据
                out.write(data.getBytes());
                out.flush();
                out.close();

                int responseCode = conn.getResponseCode();// 调用此方法就不必再使用conn.connect()方法
                if (responseCode == 200) {

                    InputStream is = conn.getInputStream();
                    String response = getStringFromInputStream(is);
                    return response;
                } else {
                    throw new NetworkErrorException("response status is "+responseCode);
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (conn != null) {
                    conn.disconnect();// 关闭连接
                }
            }

            return null;
        }

        public static String get(String url) {
            HttpURLConnection conn = null;
            try {
                // 利用string url构建URL对象
                URL mURL = new URL(url);
                conn = (HttpURLConnection) mURL.openConnection();

                conn.setRequestMethod("GET");
                conn.setReadTimeout(5000);
                conn.setConnectTimeout(10000);

                int responseCode = conn.getResponseCode();
                if (responseCode == 200) {

                    InputStream is = conn.getInputStream();
                    String response = getStringFromInputStream(is);
                    return response;
                } else {
                    throw new NetworkErrorException("response status is "+responseCode);
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {

                if (conn != null) {
                    conn.disconnect();
                }
            }

            return null;
        }

        private static String getStringFromInputStream(InputStream is)
                throws IOException {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            // 模板代码 必须熟练
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            is.close();
            String state = os.toString();// 把流中的数据转换成字符串,采用的编码是utf-8(模拟器默认编码)
            os.close();
            return state;
        }
    }

只顾网络权限!被坑了多少坏。

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图