Fast Android Networking优于它库的几个方面:

OkHttpClient-比如超时等。


OkHttpClient和Okio,所以速度很快

RxJava

支持把JSON解析成java对象(同时支持Jackson解析)。

可以得到任何请求的详细数据分析。你可以知道发送了多少字节,接收了多少字节,以及请求所花的时间。这些数据是很重要的,这样你就可以识别出慢的请求。

你可以得到当前的带宽和网络质量以写出更合理的代码-网络质量高的时候下载高质量的图片,不好的时候下载低质量的图片。

Proper Response Caching— which leads toreduced bandwidth usage.

很好的响应请求-可以减少带宽的使用。

一个executor可以被传递给任何请求让响应在另一个线程中被获取。如果你在响应中做了很重的任务,你不可以在主线程中做。

一个库就能处理所有类型的网络问题-下载,上传,multipart。

可以通过设置prefetch(预取)让请求在需要的时候立即返回缓存。

任何类型的自定义都是可以的

立即请求真的是立即发生的。

很好的取消请求。

如果一个请求完成了指定的百分比,可以阻止其取消。

一个简单的接口就可以做任何类型的请求。

Fast Android Networking Library?

最近Android Marshmallow(Android M)上对HttpClient的移除让其它的网络库都过时了。

没有哪个单一的库做完了所有的事情,比如发送请求,下载任意类型的文件,上传文件,在ImageView中加载网络图片,等等。有一些库可以但是都过时了。

OkHttp,所以支持HTTP/2。

没有哪个库为网络中所有类型的事情提供了简单的接口,比如设置优先级,取消请求等。

Fast Android Networking:

build.gradle


  1. compile 'com.amitshekhar.android:android-networking:0.2.0'


如果和RxJava一起使用


  1. compile 'com.amitshekhar.android:rx-android-networking:0.1.0'


如果和Jackson Parser一起使用


  1. compile 'com.amitshekhar.android:jackson-android-networking:0.2.0'


别忘了加网络权限


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


然后在application类的onCreate()方法中做初始化:


  1. AndroidNetworking.initialize(getApplicationContext());


 发起GET请求


  1. AndroidNetworking.get("http://api.localhost.com/{pageNumber}/test")
  2.                  .addPathParameter("pageNumber", "0")
  3.                  .addQueryParameter("limit", "3")
  4.                  .addHeaders("token", "1234")
  5.                  .setTag("test")
  6.                  .setPriority(Priority.LOW)
  7.                  .build()
  8.                  .getAsJSONArray(new JSONArrayRequestListener() {
  9.                     @Override
  10.                     public void onResponse(JSONArray response) {
  11.                     // do anything with response
  12.                     }
  13.                     @Override
  14.                     public void onError(ANError error) {
  15.                     // handle error
  16.                     }
  17.                 });


发起POST请求


  1. AndroidNetworking.post("http://api.localhost.com/createAnUser")
  2.                  .addBodyParameter("firstname", "Amit")
  3.                  .addBodyParameter("lastname", "Shekhar")
  4.                  .setTag("test")
  5.                  .setPriority(Priority.MEDIUM)
  6.                  .build()
  7.                  .getAsJSONArray(new JSONArrayRequestListener() {
  8.                     @Override
  9.                     public void onResponse(JSONArray response) {
  10.                     // do anything with response
  11.                     }
  12.                     @Override
  13.                     public void onError(ANError error) {
  14.                     // handle error
  15.                     }
  16.                 });


从服务器下载一个文件

AndroidNetworking.download(url,dirPath,fileName)
 
                 .setTag("downloadTest")
 
                 .setPriority(Priority.MEDIUM)
 
                 .build()
 
                 .setDownloadProgressListener(new DownloadProgressListener() {
 
                    @Override
 
                    public void onProgress(long bytesDownloaded, long totalBytes) {
 
                    // do anything with progress  
 
                    }
 
                 })
 
                 .startDownload(new DownloadListener() {
 
                    @Override
 
                    public void onDownloadComplete() {
 
                    // do anything after completion
 
                    }
 
                    @Override
 
                    public void onError(ANError error) {
 
                    // handle error    
 
                    }
 
                });

上传一个文件

AndroidNetworking.upload(url)
 
                 .addMultipartFile("image",file)    
 
                 .setTag("uploadTest")
 
                 .setPriority(Priority.IMMEDIATE)
 
                 .build()
 
                 .setUploadProgressListener(new UploadProgressListener() {
 
                    @Override
 
                    public void onProgress(long bytesUploaded, long totalBytes) {
 
                    // do anything with progress 
 
                    }
 
                 })
 
                 .getAsJSONObject(new JSONObjectRequestListener() {
 
                    @Override
 
                    public void onResponse(JSONObject response) {
 
                    // do anything with response                
 
                    }
 
                    @Override
 
                    public void onError(ANError error) {
 
                    // handle error 
 
                    }
 
                 });

得到一个响应并在另一个线程executor中完成

(注 : 错误和进度总是在主线程中返回)

AndroidNetworking.upload(url)
 
                 .addMultipartFile("image",file)    
 
                 .setTag("uploadTest")
 
                 .setPriority(Priority.IMMEDIATE)
 
                 .build()
 
                 .setExecutor(Executors.newSingleThreadExecutor()) // setting an executor to get response or completion on that executor thread
 
                 .setUploadProgressListener(new UploadProgressListener() {
 
                    @Override
 
                    public void onProgress(long bytesUploaded, long totalBytes) {
 
                    // do anything with progress 
 
                    }
 
                 })
 
                 .getAsJSONObject(new JSONObjectRequestListener() {
 
                    @Override
 
                    public void onResponse(JSONObject response) {
 
                    // below code will be executed in the executor provided
 
                    // do anything with response                
 
                    }
 
                    @Override
 
                    public void onError(ANError error) {
 
                    // handle error 
 
                    }
 
                 });
 


 
和JAVA对象一起使用 - JSON Parser
 

   
        
     
/*--------------Example One -> Getting the userList----------------*/
 
AndroidNetworking.get("http://api.localhost.com/getAllUsers/{pageNumber}")
 
                .addPathParameter("pageNumber", "0")
 
                .addQueryParameter("limit", "3")
 
                .setTag(this)
 
                .setPriority(Priority.LOW)
 
                .build()
 
                .getAsParsed(new TypeToken<List<User>>() {}, new ParsedRequestListener<List<User>>() {
 
                    @Override
 
                    public void onResponse(List<User> users) {
 
                    // do anything with response
 
                    Log.d(TAG, "userList size : " + users.size());
 
                    for (User user : users) {
 
                        Log.d(TAG, "id : " + user.id);
 
                        Log.d(TAG, "firstname : " + user.firstname);
 
                        Log.d(TAG, "lastname : " + user.lastname);
 
                    }
 
                    }
 
                    @Override
 
                    public void onError(ANError anError) {
 
                     // handle error
 
                    }
 
                });
 
/*--------------Example Two -> Getting an user----------------*/
 
AndroidNetworking.get("http://api.localhost.com/getAnUser/{userId}")
 
                .addPathParameter("userId", "1")
 
                .setTag(this)
 
                .setPriority(Priority.LOW)
 
                .build()
 
                .getAsParsed(new TypeToken<User>() {}, new ParsedRequestListener<User>() {
 
                     @Override
 
                     public void onResponse(User user) {
 
                     // do anything with response
 
                         Log.d(TAG, "id : " + user.id);
 
                         Log.d(TAG, "firstname : " + user.firstname);
 
                         Log.d(TAG, "lastname : " + user.lastname);
 
                     }
 
                     @Override
 
                     public void onError(ANError anError) {
 
                      // handle error
 
                     }
 
                 }); 
 

/*-- Note : TypeToken and getAsParsed is important here --*/




 


用ConnectionClass Listener得到当前网络质量和带宽

     
     
// Adding Listener
 
AndroidNetworking.setConnectionQualityChangeListener(new ConnectionQualityChangeListener() {
 
            @Override
 
            public void onChange(ConnectionQuality currentConnectionQuality, int currentBandwidth) {
 
                // do something on change in connectionQuality
 
            }
 
        });
 
 
 
// Removing Listener   
 
AndroidNetworking.removeConnectionQualityChangeListener();
 
 
 
// Getting current ConnectionQuality
 
ConnectionQuality connectionQuality = AndroidNetworking.getCurrentConnectionQuality();
 
if(connectionQuality == ConnectionQuality.EXCELLENT){
 
// do something
 
}else if (connectionQuality == ConnectionQuality.POOR){
 
// do something
 
}else if (connectionQuality == ConnectionQuality.UNKNOWN){
 
// do something
 
}
 
// Getting current bandwidth
 
int currentBandwidth = AndroidNetworking.getCurrentBandwidth(); // Note : if (currentBandwidth == 0) : means UNKNOWN
 

   
   取消一个请求
   
   任何一个指定了tag的请求都可以被取消。
   
       
    AndroidNetworking.cancel("tag");
 
   
   把从网络加载的图片放到ImageView
   
       
    
      <com.androidnetworking.widget.ANImageView
 
          android:id="@+id/imageView"
 
          android:layout_width="100dp"
 
          android:layout_height="100dp"
 
          android:layout_gravity="center" />
 
 
 
      imageView.setDefaultImageResId(R.drawable.default);
 
      imageView.setErrorImageResId(R.drawable.error);
 
      imageView.setImageUrl(imageUrl);
 

   
   从url获取指定了一些参数的Bitmap
   
       
    
AndroidNetworking.get(imageUrl)
 
                 .setTag("imageRequestTag")
 
                 .setPriority(Priority.MEDIUM)
 
                 .setBitmapMaxHeight(100)
 
                 .setBitmapMaxWidth(100)
 
                 .setBitmapConfig(Bitmap.Config.ARGB_8888)
 
                 .build()
 
                 .getAsBitmap(new BitmapRequestListener() {
 
                    @Override
 
                    public void onResponse(Bitmap bitmap) {
 
                    // do anything with bitmap
 
                    }
 
                    @Override
 
                    public void onError(ANError error) {
 
                    // handle error
 
                    }
 
                });
 

   
   Prefetch a request (so that it can return from cache when required at instant)
   
       
    
AndroidNetworking.get(ApiEndPoint.BASE_URL + ApiEndPoint.GET_JSON_ARRAY)
 
                .addPathParameter("pageNumber", "0")
 
                .addQueryParameter("limit", "30")
 
                .setTag(this)
 
                .setPriority(Priority.LOW)
 
                .build()
 
                .prefetch();
 

   
   为某个请求自定义OkHttpClient
   
       
    
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
 
                .addInterceptor(new GzipRequestInterceptor())
 
                .build();
 
 
 
AndroidNetworking.get("http://api.localhost.com/{pageNumber}/test")
 
                 .addPathParameter("pageNumber", "0")
 
                 .addQueryParameter("limit", "3")
 
                 .addHeaders("token", "1234")
 
                 .setTag("test")
 
                 .setPriority(Priority.LOW)
 
                 .setOkHttpClient(okHttpClient) // passing a custom okHttpClient 
 
                 .build()
 
                 .getAsJSONArray(new JSONArrayRequestListener() {
 
                    @Override
 
                    public void onResponse(JSONArray response) {
 
                    // do anything with response
 
                    }
 
                    @Override
 
                    public void onError(ANError error) {
 
                    // handle error
 
                    }
 
                });
 

   
   

   
   Getting Analytics of a request by setting AnalyticsListener on that
   
       
    
AndroidNetworking.download(url,dirPath,fileName)
 
                 .setTag("downloadTest")
 
                 .setPriority(Priority.MEDIUM)
 
                 .build()
 
                 .setAnalyticsListener(new AnalyticsListener() {
 
                      @Override
 
                      public void onReceived(long timeTakenInMillis, long bytesSent, long bytesReceived, boolean isFromCache) {
 
                          Log.d(TAG, " timeTakenInMillis : " + timeTakenInMillis);
 
                          Log.d(TAG, " bytesSent : " + bytesSent);
 
                          Log.d(TAG, " bytesReceived : " + bytesReceived);
 
                          Log.d(TAG, " isFromCache : " + isFromCache);
 
                      }
 
                  })
 
                 .setDownloadProgressListener(new DownloadProgressListener() {
 
                    @Override
 
                    public void onProgress(long bytesDownloaded, long totalBytes) {
 
                    // do anything with progress  
 
                    }
 
                 })
 
                 .startDownload(new DownloadListener() {
 
                    @Override
 
                    public void onDownloadComplete() {
 
                    // do anything after completion
 
                    }
 
                    @Override
 
                    public void onError(ANError error) {
 
                    // handle error    
 
                    }
 
                });