Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

🚀 A Complete Fast Android Networking Library that also supports HTTP/2 🚀

License

NotificationsYou must be signed in to change notification settings

amitshekhariitbhu/Fast-Android-Networking

Repository files navigation

Fast Android Networking Library

About Fast Android Networking Library

Fast Android Networking Library is a powerful library for doing any type of networking in Android applications which is made on top ofOkHttp Networking Layer.

Fast Android Networking Library takes care of each and everything. So you don't have to do anything, just make request and listen for the response.

Why use Fast Android Networking ?

  • Recent removal of HttpClient in Android Marshmallow(Android M) made other networking libraries obsolete.
  • No other single library does each and everything like making request, downloading any type of file, uploading file, loadingimage from network in ImageView, etc. There are some libraries but they are outdated.
  • No other library provides simple interface for doing all types of things in networking like setting priority, cancelling, etc.
  • As it usesOkio , No more GC overhead in android applications.Okio is made to handle GC overhead while allocating memory.Okio does some clever things to save CPU and memory.
  • It usesOkHttp , more importantly it supports HTTP/2.

About me

Hi, I am Amit Shekhar, Co-Founder @Outcome School • IIT 2010-14 • I have taught and mentored many developers, and their efforts landed them high-paying tech jobs, helped many tech companies in solving their unique problems, and created many open-source libraries being used by top companies. I am passionate about sharing knowledge through open-source, blogs, and videos.

You can connect with me on:

Outcome School Blog - High-quality content to learn Android concepts.

RxJava2 Support,check here.

Find this project useful ? ❤️

  • Support it by clicking the ⭐ button on the upper right of this page. ✌️

For full details, visit the documentation on our web site :

Requirements

Fast Android Networking Library can be included in any Android application.

Fast Android Networking Library supports Android 2.3 (Gingerbread) and later.

Using Fast Android Networking Library in your application

Add this in yoursettings.gradle:

maven { url'https://jitpack.io' }

If you are usingsettings.gradle.kts, add the following:

maven { setUrl("https://jitpack.io") }

Add this in yourbuild.gradle

implementation'com.github.amitshekhariitbhu.Fast-Android-Networking:android-networking:1.0.4'

If you are usingbuild.gradle.kts, add the following:

implementation("com.github.amitshekhariitbhu.Fast-Android-Networking:android-networking:1.0.4")

Do not forget to add internet permission in manifest if already not present

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

Then initialize it in onCreate() Method of application class :

AndroidNetworking.initialize(getApplicationContext());

Initializing it with some customization , as it usesOkHttp as networking layer, you can pass custom okHttpClient while initializing it.

// Adding an Network Interceptor for Debugging purpose :OkHttpClientokHttpClient =newOkHttpClient() .newBuilder()                        .addNetworkInterceptor(newStethoInterceptor())                        .build();AndroidNetworking.initialize(getApplicationContext(),okHttpClient);

Using the Fast Android Networking with Jackson Parser

Add this in yourbuild.gradle

implementation'com.github.amitshekhariitbhu.Fast-Android-Networking:jackson-android-networking:1.0.4'

If you are usingbuild.gradle.kts, add the following:

implementation("com.github.amitshekhariitbhu.Fast-Android-Networking:jackson-android-networking:1.0.4")
// Then set the JacksonParserFactory like belowAndroidNetworking.setParserFactory(newJacksonParserFactory());

Using the Fast Android Networking with RxJava2

Add this in yourbuild.gradle

implementation'com.github.amitshekhariitbhu.Fast-Android-Networking:rx2-android-networking:1.0.4'

If you are usingbuild.gradle.kts, add the following:

implementation("com.github.amitshekhariitbhu.Fast-Android-Networking:rx2-android-networking:1.0.4")

Using the Fast Android Networking with RxJava

Add this in yourbuild.gradle

implementation'com.github.amitshekhariitbhu.Fast-Android-Networking:rx-android-networking:1.0.4'

If you are usingbuild.gradle.kts, add the following:

implementation("com.github.amitshekhariitbhu.Fast-Android-Networking:rx-android-networking:1.0.4")

Making a GET Request

AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")                 .addPathParameter("pageNumber","0")                 .addQueryParameter("limit","3")                 .addHeaders("token","1234")                 .setTag("test")                 .setPriority(Priority.LOW)                 .build()                 .getAsJSONArray(newJSONArrayRequestListener() {@OverridepublicvoidonResponse(JSONArrayresponse) {// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });

Making a POST Request

AndroidNetworking.post("https://fierce-cove-29863.herokuapp.com/createAnUser")                 .addBodyParameter("firstname","Amit")                 .addBodyParameter("lastname","Shekhar")                 .setTag("test")                 .setPriority(Priority.MEDIUM)                 .build()                 .getAsJSONObject(newJSONObjectRequestListener() {@OverridepublicvoidonResponse(JSONObjectresponse) {// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });

You can also post java object, json, file, etc in POST request like this.

Useruser =newUser();user.firstname ="Amit";user.lastname ="Shekhar";AndroidNetworking.post("https://fierce-cove-29863.herokuapp.com/createUser")                 .addBodyParameter(user)// posting java object                 .setTag("test")                 .setPriority(Priority.MEDIUM)                 .build()                 .getAsJSONArray(newJSONArrayRequestListener() {@OverridepublicvoidonResponse(JSONArrayresponse) {// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });JSONObjectjsonObject =newJSONObject();try {jsonObject.put("firstname","Amit");jsonObject.put("lastname","Shekhar");}catch (JSONExceptione) {e.printStackTrace();}AndroidNetworking.post("https://fierce-cove-29863.herokuapp.com/createUser")                 .addJSONObjectBody(jsonObject)// posting json                 .setTag("test")                 .setPriority(Priority.MEDIUM)                 .build()                 .getAsJSONArray(newJSONArrayRequestListener() {@OverridepublicvoidonResponse(JSONArrayresponse) {// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });AndroidNetworking.post("https://fierce-cove-29863.herokuapp.com/postFile")                 .addFileBody(file)// posting any type of file                 .setTag("test")                 .setPriority(Priority.MEDIUM)                 .build()                 .getAsJSONObject(newJSONObjectRequestListener() {@OverridepublicvoidonResponse(JSONObjectresponse) {// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });

Using it with your own JAVA Object - JSON Parser

/*--------------Example One -> Getting the userList----------------*/AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")                .addPathParameter("pageNumber","0")                .addQueryParameter("limit","3")                .setTag(this)                .setPriority(Priority.LOW)                .build()                .getAsObjectList(User.class,newParsedRequestListener<List<User>>() {@OverridepublicvoidonResponse(List<User>users) {// do anything with responseLog.d(TAG,"userList size : " +users.size());for (Useruser :users) {Log.d(TAG,"id : " +user.id);Log.d(TAG,"firstname : " +user.firstname);Log.d(TAG,"lastname : " +user.lastname);                      }                    }@OverridepublicvoidonError(ANErroranError) {// handle error                    }                });/*--------------Example Two -> Getting an user----------------*/AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAnUserDetail/{userId}")                .addPathParameter("userId","1")                .setTag(this)                .setPriority(Priority.LOW)                .build()                .getAsObject(User.class,newParsedRequestListener<User>() {@OverridepublicvoidonResponse(Useruser) {// do anything with responseLog.d(TAG,"id : " +user.id);Log.d(TAG,"firstname : " +user.firstname);Log.d(TAG,"lastname : " +user.lastname);                     }@OverridepublicvoidonError(ANErroranError) {// handle error                     }                 });/*-- Note : YourObject.class, getAsObject and getAsObjectList are important here --*/

Downloading a file from server

AndroidNetworking.download(url,dirPath,fileName)                 .setTag("downloadTest")                 .setPriority(Priority.MEDIUM)                 .build()                 .setDownloadProgressListener(newDownloadProgressListener() {@OverridepublicvoidonProgress(longbytesDownloaded,longtotalBytes) {// do anything with progress                    }                 })                 .startDownload(newDownloadListener() {@OverridepublicvoidonDownloadComplete() {// do anything after completion                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });

Uploading a file to server

AndroidNetworking.upload(url)                 .addMultipartFile("image",file)                     .addMultipartParameter("key","value")                 .setTag("uploadTest")                 .setPriority(Priority.HIGH)                 .build()                 .setUploadProgressListener(newUploadProgressListener() {@OverridepublicvoidonProgress(longbytesUploaded,longtotalBytes) {// do anything with progress                    }                 })                 .getAsJSONObject(newJSONObjectRequestListener() {@OverridepublicvoidonResponse(JSONObjectresponse) {// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                 });

Getting Response and completion in an another thread executor

(Note : Error and Progress will always be returned in main thread of application)

AndroidNetworking.upload(url)                 .addMultipartFile("image",file)                   .addMultipartParameter("key","value")                   .setTag("uploadTest")                 .setPriority(Priority.HIGH)                 .build()                 .setExecutor(Executors.newSingleThreadExecutor())// setting an executor to get response or completion on that executor thread                 .setUploadProgressListener(newUploadProgressListener() {@OverridepublicvoidonProgress(longbytesUploaded,longtotalBytes) {// do anything with progress                    }                 })                 .getAsJSONObject(newJSONObjectRequestListener() {@OverridepublicvoidonResponse(JSONObjectresponse) {// below code will be executed in the executor provided// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                 });

Setting a Percentage Threshold For Not Cancelling the request if it has completed the given threshold

AndroidNetworking.download(url,dirPath,fileName)                 .setTag("downloadTest")                 .setPriority(Priority.MEDIUM)                 .setPercentageThresholdForCancelling(50)// even if at the time of cancelling it will not cancel if 50%                 .build()// downloading is done.But can be cancalled with forceCancel.                 .setDownloadProgressListener(newDownloadProgressListener() {@OverridepublicvoidonProgress(longbytesDownloaded,longtotalBytes) {// do anything with progress                    }                 })                 .startDownload(newDownloadListener() {@OverridepublicvoidonDownloadComplete() {// do anything after completion                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });

Cancelling a request.

Any request with a given tag can be cancelled. Just do like this.

AndroidNetworking.cancel("tag");// All the requests with the given tag will be cancelled.AndroidNetworking.forceCancel("tag");// All the requests with the given tag will be cancelled , even if any percent threshold is// set , it will be cancelled forcefully.AndroidNetworking.cancelAll();// All the requests will be cancelled.AndroidNetworking.forceCancelAll();// All the requests will be cancelled , even if any percent threshold is// set , it will be cancelled forcefully.

Loading image from network into ImageView

      <com.androidnetworking.widget.ANImageViewandroid: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);

Getting Bitmap from url with some specified parameters

AndroidNetworking.get(imageUrl)                 .setTag("imageRequestTag")                 .setPriority(Priority.MEDIUM)                 .setBitmapMaxHeight(100)                 .setBitmapMaxWidth(100)                 .setBitmapConfig(Bitmap.Config.ARGB_8888)                 .build()                 .getAsBitmap(newBitmapRequestListener() {@OverridepublicvoidonResponse(Bitmapbitmap) {// do anything with bitmap                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });

Error Code Handling

publicvoidonError(ANErrorerror) {if (error.getErrorCode() !=0) {// received error from server// error.getErrorCode() - the error code from server// error.getErrorBody() - the error body from server// error.getErrorDetail() - just an error detailLog.d(TAG,"onError errorCode : " +error.getErrorCode());Log.d(TAG,"onError errorBody : " +error.getErrorBody());Log.d(TAG,"onError errorDetail : " +error.getErrorDetail());// get parsed error object (If ApiError is your class)ApiErrorapiError =error.getErrorAsObject(ApiError.class);   }else {// error.getErrorDetail() : connectionError, parseError, requestCancelledErrorLog.d(TAG,"onError errorDetail : " +error.getErrorDetail());   }}

Remove Bitmap from cache or clear cache

AndroidNetworking.evictBitmap(key);// remove a bitmap with key from LruCacheAndroidNetworking.evictAllBitmap();// clear LruCache

Prefetch a request (so that it can return from cache when required at instant)

AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")                .addPathParameter("pageNumber","0")                .addQueryParameter("limit","30")                .setTag(this)                .setPriority(Priority.LOW)                .build()                .prefetch();

Customizing OkHttpClient for a particular request

OkHttpClientokHttpClient =newOkHttpClient().newBuilder()                .addInterceptor(newGzipRequestInterceptor())                .build();AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")                 .addPathParameter("pageNumber","0")                 .addQueryParameter("limit","3")                 .addHeaders("token","1234")                 .setTag("test")                 .setPriority(Priority.LOW)                 .setOkHttpClient(okHttpClient)// passing a custom okHttpClient                 .build()                 .getAsJSONArray(newJSONArrayRequestListener() {@OverridepublicvoidonResponse(JSONArrayresponse) {// do anything with response                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });

Making a conditional request (Building a request)

ANRequest.GetRequestBuildergetRequestBuilder =newANRequest.GetRequestBuilder(ApiEndPoint.BASE_URL +ApiEndPoint.CHECK_FOR_HEADER);if(isHeaderRequired){getRequestBuilder.addHeaders("token","1234");}if(executorRequired){getRequestBuilder.setExecutor(Executors.newSingleThreadExecutor());}ANRequestanRequest =getRequestBuilder.build();anRequest.getAsJSONObject(newJSONObjectRequestListener() {@OverridepublicvoidonResponse(JSONObjectresponse) {// do anything with response    }@OverridepublicvoidonError(ANErrorerror) {// handle error    }});

ConnectionClass Listener to get current network quality and bandwidth

// Adding ListenerAndroidNetworking.setConnectionQualityChangeListener(newConnectionQualityChangeListener() {@OverridepublicvoidonChange(ConnectionQualitycurrentConnectionQuality,intcurrentBandwidth) {// do something on change in connectionQuality            }        });// Removing ListenerAndroidNetworking.removeConnectionQualityChangeListener();// Getting current ConnectionQualityConnectionQualityconnectionQuality =AndroidNetworking.getCurrentConnectionQuality();if(connectionQuality ==ConnectionQuality.EXCELLENT) {// do something}elseif (connectionQuality ==ConnectionQuality.POOR) {// do something}elseif (connectionQuality ==ConnectionQuality.UNKNOWN) {// do something}// Getting current bandwidthintcurrentBandwidth =AndroidNetworking.getCurrentBandwidth();// Note : if (currentBandwidth == 0) : means UNKNOWN

Getting Analytics of a request by setting AnalyticsListener on that

AndroidNetworking.download(url,dirPath,fileName)                 .setTag("downloadTest")                 .setPriority(Priority.MEDIUM)                 .build()                 .setAnalyticsListener(newAnalyticsListener() {@OverridepublicvoidonReceived(longtimeTakenInMillis,longbytesSent,longbytesReceived,booleanisFromCache) {Log.d(TAG," timeTakenInMillis : " +timeTakenInMillis);Log.d(TAG," bytesSent : " +bytesSent);Log.d(TAG," bytesReceived : " +bytesReceived);Log.d(TAG," isFromCache : " +isFromCache);                      }                  })                 .setDownloadProgressListener(newDownloadProgressListener() {@OverridepublicvoidonProgress(longbytesDownloaded,longtotalBytes) {// do anything with progress                    }                 })                 .startDownload(newDownloadListener() {@OverridepublicvoidonDownloadComplete() {// do anything after completion                    }@OverridepublicvoidonError(ANErrorerror) {// handle error                    }                });Note :IfbytesSentorbytesReceivedis -1 ,itmeansitisunknown

Getting OkHttpResponse in Response

AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAnUserDetail/{userId}")                .addPathParameter("userId","1")                .setTag(this)                .setPriority(Priority.LOW)                .setUserAgent("getAnUser")                .build()                .getAsOkHttpResponseAndParsed(newTypeToken<User>() {                },newOkHttpResponseAndParsedRequestListener<User>() {@OverridepublicvoidonResponse(ResponseokHttpResponse,Useruser) {// do anything with okHttpResponse and user                    }@OverridepublicvoidonError(ANErroranError) {// handle error                    }                });

Making Synchronous Request

ANRequestrequest =AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")                        .addPathParameter("pageNumber","0")                        .addQueryParameter("limit","3")                        .build();ANResponse<List<User>>response =request.executeForObjectList(User.class);if (response.isSuccess()) {List<User>users =responseTwo.getResult();}else {//handle error}

How caching works ?

  • First of all the server must send cache-control in header so that is starts working.
  • Response will be cached on the basis of cache-control max-age,max-stale.
  • If internet is connected and the age is NOT expired it will return from cache.
  • If internet is connected and the age is expired and if server returns 304(NOT MODIFIED) it will return from cache.
  • If internet is NOT connected if you are using getResponseOnlyIfCached() - it will return from cache even it date is expired.
  • If internet is NOT connected , if you are NOT using getResponseOnlyIfCached() - it will NOT return anything.
  • If you are using getResponseOnlyFromNetwork() , it will only return response after validation from server.
  • If cache-control is set, it will work according to the max-age,max-stale returned from server.
  • If internet is NOT connected only way to get cache Response is by using getResponseOnlyIfCached().

Enabling Logging

AndroidNetworking.enableLogging();// simply enable loggingAndroidNetworking.enableLogging(LEVEL.HEADERS);// enabling logging with level

Enabling GZIP From Client to Server

// Enabling GZIP for Request (Not needed if your server doesn't support GZIP Compression), anyway responses// from server are automatically unGzipped if required. So enable it only if you need your request to be// Gzipped before sending to server(Make sure your server support GZIP Compression).OkHttpClientokHttpClient =newOkHttpClient().newBuilder()                .addInterceptor(newGzipRequestInterceptor())                .build();AndroidNetworking.initialize(getApplicationContext(),okHttpClient);

IMPORTANT NOTE

  • Use IMMEDIATE Priority with caution - use is at appropriate place only when1 or 2 (at max 2)IMMEDIATE request is required at instant.Otherwise use HIGH Priority.

  • Known Bug : As present if you are using GZIP Interceptor from client to server, Upload progressis not working perfectly in Multipart.

    If you are using Proguard with Gradle build system (which is usually the case), you don't have to do anything. The appropriate Proguard rules will be automatically applied. If you still need the rules applied inproguard-rules.pro, it is as follows:

    -dontwarn okio.**

Fast Android Networking Library supports

  • Fast Android Networking Library supports all types of HTTP/HTTPS request like GET, POST, DELETE, HEAD, PUT, PATCH
  • Fast Android Networking Library supports downloading any type of file
  • Fast Android Networking Library supports uploading any type of file (supports multipart upload)
  • Fast Android Networking Library supports cancelling a request
  • Fast Android Networking Library supports setting priority to any request (LOW, MEDIUM, HIGH, IMMEDIATE)
  • Fast Android Networking Library supportsRxJava

As it usesOkHttp as a networking layer, it supports:

  • Fast Android Networking Library supports HTTP/2 support allows all requests to the same host to share a socket
  • Fast Android Networking Library uses connection pooling which reduces request latency (if HTTP/2 isn’t available)
  • Transparent GZIP shrinks download sizes
  • Fast Android Networking Library supports response caching which avoids the network completely for repeat requests

Difference over other Networking Library

  • In Fast Android Networking Library, OkHttpClient can be customized for every request easily — like timeout customization, etc. for each request.
  • As Fast Android Networking Library usesOkHttp andOkio, it is faster.
  • Single library for all type of networking.
  • Supports RxJava, RxJava2 ->Check here
  • Current bandwidth and connection quality can be obtained to decide logic of code.
  • Executor can be passed to any request to get the response in another thread.
  • Complete analytics of any request can be obtained.
  • All types of customization are possible.
  • Immediate Request really is immediate now.
  • Prefetching of any request can be done so that it gives instant data when required from the cache.
  • Proper request canceling.
  • Prevents cancellation of a request if it’s completed more than a specific threshold percentage.
  • A simple interface to make any type of request.
  • Proper Response Caching — which leads to reduced bandwidth usage.

TODO

  • Integration with other library
  • And of course many many features and bug fixes

CREDITS

Contact - Let's become friend

License

   Copyright (C) 2024 Amit Shekhar   Licensed under the Apache License, Version 2.0 (the "License");   you may not use this file except in compliance with the License.   You may obtain a copy of the License at       http://www.apache.org/licenses/LICENSE-2.0   Unless required by applicable law or agreed to in writing, software   distributed under the License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the License for the specific language governing permissions and   limitations under the License.

Contributing to Fast Android Networking

All pull requests are welcome, make sure to follow thecontribution guidelineswhen you submit pull request.


[8]ページ先頭

©2009-2025 Movatter.jp