package com.litesuits.http.sample;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.*;
import com.litesuits.http.HttpConfig;
import com.litesuits.http.LiteHttp;
import com.litesuits.http.annotation.*;
import com.litesuits.http.concurrent.OverloadPolicy;
import com.litesuits.http.concurrent.SchedulePolicy;
import com.litesuits.http.concurrent.SmartExecutor;
import com.litesuits.http.custom.CustomJSONParser;
import com.litesuits.http.custom.FastJson;
import com.litesuits.http.custom.MyHttpExceptHandler;
import com.litesuits.http.data.GsonImpl;
import com.litesuits.http.data.Json;
import com.litesuits.http.data.NameValuePair;
import com.litesuits.http.data.StatisticsInfo;
import com.litesuits.http.exception.HttpException;
import com.litesuits.http.impl.huc.HttpUrlClient;
import com.litesuits.http.listener.GlobalHttpListener;
import com.litesuits.http.listener.HttpListener;
import com.litesuits.http.log.HttpLog;
import com.litesuits.http.model.User;
import com.litesuits.http.model.api.RichParam;
import com.litesuits.http.model.api.UserParam;
import com.litesuits.http.request.*;
import com.litesuits.http.request.content.*;
import com.litesuits.http.request.content.multi.*;
import com.litesuits.http.request.param.*;
import com.litesuits.http.request.query.JsonQueryBuilder;
import com.litesuits.http.response.Response;
import com.litesuits.http.utils.HttpUtil;
import org.json.JSONObject;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
public class MainActivity extends Activity {
protected String TAG = MainActivity.class.getSimpleName();
protected ListView mListview;
protected BaseAdapter mAdapter;
protected static LiteHttp liteHttp;
protected Activity activity = null;
protected int count = 0;
private boolean needRestore;
public static final String url = "http://baidu.com";
public static final String httpsUrl = "https://baidu.com";
//public static final String httpsUrl = "https://www.thanku.love";
public static final String uploadUrl = "http://192.168.31.121:8080/upload";
public static final String baseUrl = "http://litesuits.com";
public static final String userUrl = "/mockdata/user_get";
public static final String loginUrl = "/mockdata/user_get";
public static final String picUrl = "/mockdata/a.jpg";
public static final String fileUrl1 = "/mockdata/d.jpg";
public static final String fileUrl2 = "/mockdata/c.jpg";
public static final String redirectUrl = "http://www.baidu.com/link?url=Lqc3GptP8u05JCRDsk0jqsAvIZh9WdtO_RkXYMYRQEm";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
activity = this;
initViews();
initLiteHttp();
}
private void initViews() {
mListview = (ListView) findViewById(R.id.listview);
mAdapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.tv_item,
getResources().getStringArray(R.array.http_test_list));
mListview.setAdapter(mAdapter);
mListview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
clickTestItem(position);
}
});
}
/**
* 单例 keep an singleton instance of litehttp
*/
private void initLiteHttp() {
if (liteHttp == null) {
liteHttp = LiteHttp.build(this)
.setHttpClient(new HttpUrlClient()) // http client
.setJsonConvertor(new GsonImpl()) // json convertor
.setBaseUrl(baseUrl) // set base url
.setDebugged(true) // log output when debugged
.setDoStatistics(true) // statistics of time and traffic
.setDetectNetwork(true) // detect network before connect
.setUserAgent("Mozilla/5.0 (...)") // set custom User-Agent
.setSocketTimeout(10000) // socket timeout: 10s
.setConnectTimeout(10000) // connect timeout: 10s
.create();
} else {
liteHttp.getConfig() // configuration directly
.setSocketTimeout(5000) // socket timeout: 5s
.setConnectTimeout(5000); // connect timeout: 5s
}
}
/**
* <item>0. Quickly Configuration</item>
* <item>1. Asynchronous Request</item>
* <item>2. Synchronous Request</item>
* <item>3. Simple Synchronous Request</item>
* <item>4. Exception Thrown Request</item>
* <item>5. HTTPS Reqeust</item>
* <item>6. Automatic Model Conversion</item>
* <item>7. Custom Data Parser</item>
* <item>8. Replace Json Library</item>
* <item>9. File/Bitmap Download</item>
* <item>10. File Upload</item>
* <item>11. Disable Some Network</item>
* <item>12. Traffic/Time Statistics</item>
* <item>13. Retry/Redirect</item>
* <item>14. Best Practices of Exception Handling</item>
* <item>15. Best Practices of Cancel Request</item>
* <p/>
* <item>16. POST Multi-Form Data</item>
* <item>17. Concurrent and Scheduling</item>
* <item>18. Detail of Config</item>
* <item>19. Usage of Annotation</item>
* <item>20. Multi Cache Mechanism</item>
* <item>21. CallBack Mechanism</item>
* <item>22. Best Practice: SmartExecutor</item>
* <item>23. Best Practice: Auto-Conversion of Complex Model</item>
* <item>24. Best Practice: HTTP Rich Param Model</item>
*/
private void clickTestItem(final int which) {
// restore http config
if (needRestore) {
liteHttp.getConfig().restoreToDefault().setBaseUrl(baseUrl);
needRestore = false;
}
switch (which) {
case 0:
initLiteHttp();
HttpUtil.showTips(activity, "LiteHttp2.0", "Init Config Success!");
StringRequest login = new StringRequest("https://10.218.128.111/router/rest?")
.setMethod(HttpMethods.Post)
.setHttpListener(new HttpListener<String>() {
@Override
public void onSuccess(String s, Response<String> response) {
response.printInfo();
}
@Override
public void onFailure(HttpException e, Response<String> response) {
response.printInfo();
}
})
.setHttpBody(new UrlEncodedFormBody("app_key=4272&cp_code=D_DBKD&format=json&login_account=123456&method=cainiao.yima.app.password.login&os_type=2&password=14e1b600b1fd579f47433b88e8d85291&sign=667037188C082C22C111689EFE06320E&sign_method=md5×tamp=2016-05-06&v=2.0"));
liteHttp.executeAsync(login);
break;
case 1:
// 1. Asynchronous Request
// 1.0 init request
final StringRequest request = new StringRequest(url).setHttpListener(
new HttpListener<String>() {
@Override
public void onSuccess(String s, Response<String> response) {
HttpUtil.showTips(activity, "Asynchronous", s);
response.printInfo();
}
@Override
public void onFailure(HttpException e, Response<String> response) {
HttpUtil.showTips(activity, "Asynchronous", e.toString());
}
}
);
liteHttp.executeAsync(request);
// 1.2 perform async, future task returned.
final StringRequest request2 = new StringRequest(url).setHttpListener(
new HttpListener<String>() {
@Override
public void onCancel(String s, Response<String> response) {
HttpUtil.showTips(activity, "Perform Async", "Async Task Cancel");
}
}
);
// get future task
FutureTask<String> task = liteHttp.performAsync(request2);
// cancel request
request2.cancel();
break;
case 2:
// 2. Synchronous Request
Runnable run = new Runnable() {
@Override
public void run() {
// 2.0 execute: return fully response
Response<User> response = liteHttp.execute(new RichParam(1, "a"));
User user = response.getResult();
Log.i(TAG, "User: " + user);
// 2.1 perform: return java model directly
User user2 = liteHttp.perform(new JsonAbsRequest<User>(userUrl) {});
Log.i(TAG, "User: " + user2);
// 2.2 return data directly, handle result on current thread
Bitmap bitmap = liteHttp.perform(new BitmapRequest(picUrl).setHttpListener(
new HttpListener<Bitmap>(false, true, true) {
@Override
public void onLoading(AbstractRequest<Bitmap> request, long total, long len) {
// down loading notification ...
Log.i(TAG, "total: " + total + " len: " + len);
}
}));
if (bitmap != null) {
bitmap.recycle();
}
// 2.3 handle result on UI thread(主线程处理,注意HttpListener默认是在主线程回调)
liteHttp.execute(new StringRequest(url).setHttpListener(
new HttpListener<String>(true) {
@Override
public void onSuccess(String data, Response<String> response) {
HttpUtil.showTips(activity, "Synchronous", data);
}
@Override
public void onFailure(HttpException e, Response<String> response) {
HttpUtil.showTips(activity, "Synchronous", e.getMessage());
}
}
));
}
};
new Thread(run).start();
break;
case 3:
// 3. Simple Synchronous Request
new AsyncTask<Void, String, ArrayList<NameValuePair>>() {
@Override
protected ArrayList<NameValuePair> doInBackground(Void... params) {
// 3.0 simple get and publish
String result = liteHttp.get(url);
Log.i(TAG, "get result: " + result);
publishProgress("Simple Get String: \n" + result);
// 3.1 simple post and publish
result = liteHttp.post(new StringRequest(httpsUrl));
Log.i(TAG, "post result: " + result);
publishProgress("Simple POST String: \n" + result);
// 3.2 simple post and publish
User user = liteHttp.get(userUrl, User.class);
Log.i(TAG, "user: " + user);
publishProgress("Simple Get User: \n" + user);
// 3.3 simple head and return
ArrayList<NameValuePair> headers = liteHttp.head(new StringRequest(url));
return headers;
}
@Override
protected void onProgressUpdate(String... values) {
Toast.makeText(activity, "content length:" + values[0].length(), Toast.LENGTH_LONG).show();
}
@Override
protected void onPostExecute(ArrayList<NameValuePair> nameValuePairs) {
HttpUtil.showTips(activity, "Simple Mode", String.valueOf(nameValuePairs));
}
}.execute();
break;
case 4:
// 4. Exception Thrown Request
run = new Runnable() {
@Override
public void run() {
// http scheme error
try {
Response response = liteHttp.executeOrThrow(new BytesRequest("haha://hehe"));
} catch (HttpException e) {
Log.e(TAG, "HttpException: " + e.getCause());
Log.e(TAG, "HttpException: " + e.getMessage());
Log.e(TAG, "HttpException: " + e.getLocalizedMessage());
}
// java model translate error
try {
User user = liteHttp.performOrThrow(new JsonAbsRequest<User>("http://thanku.love") {});
} catch (final HttpException e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
HttpUtil.showTips(activity, "Thrown Test", e.getMessage());
}
});
}
}
};
new Thread(run).start();
break;
case 5:
// 5. HTTPS Reqeust
liteHttp.executeAsync(new StringRequest(httpsUrl).setHttpListener(
new HttpListener<String>() {
@Override
public void onSuccess(String s, Response<String> response) {
HttpUtil.showTips(activity, "HTTPS TEST", " Read Content Length: " + s.length());
}
@Override
public void onFailure(HttpException e, Response<String> response) {
HttpUtil.showTips(activity, "HTTPS TEST", Arrays.toString(e.getStackTrace()));
}
}
));
break;
case 6:
// 6. Automatic Model Conversion
// build as http://{userUrl}?id=168&key=md5
liteHttp.executeAsync(new StringRequest(userUrl, new UserParam(18, "md5")).setHttpListener(
new HttpListener<String>() {
@Override
public void onSuccess(String data, Response<String> response) {
Log.i(TAG, "USER: " + data);
}
}));
/**
* Request Model : json string translate to user object
*/
class UserRequest extends JsonAbsRequest<User> {
public UserRequest(String url, HttpParamModel param) {
super(url, param);
}
}
// build as http://{userUrl}?id=168&key=md5
UserRequest userRequest = new UserRequest(userUrl, new UserParam(18, "md5"));
userRequest.setHttpListener(new HttpListener<User>() {
@Override
public void onSuccess(User user, Response<User> response) {
// data has been translated to user object
HttpUtil.showTips(activity, "Model Convert", user.toString());
}
});
liteHttp.executeAsync(userRequest);
break;
case 7:
// 7. Custom Data Parser
JsonRequest<JSONObject> jsonRequest = new JsonRequest<JSONObject>(userUrl, JSONObject.class);
jsonRequest.setDataParser(new CustomJSONParser());
liteHttp.executeAsync(jsonRequest.setHttpListener(new HttpListener<JSONObject>() {
@Override
public void onSuccess(JSONObject jsonObject, Response<JSONObject> response) {
HttpUtil.showTips(activity, "Custom Data Parser",
"Custom JSONObject Parser:\n" + jsonObject.toString());
}
}));
break;
case 8:
// 8. Replace Json Convertor
// first, set new json framework instance. then, over.
liteHttp.getConfig().setJsonConvertor(new FastJson());
String uj = "{\"api\":\"com.xx.get.userinfo\",\"v\":\"1.0\",\"code\":200,\"message\":\"success\",\"data\":{\"age\":18,\"name\":\"qingtianzhu\",\"girl_friends\":[\"xiaoli\",\"fengjie\",\"lucy\"]}}";
User u11 = Json.get().toObject(uj, User.class);
System.out.println("User:" + u11);
// json model convert used #FastJson
liteHttp.executeAsync(new JsonAbsRequest<User>(userUrl) {}.setHttpListener(new HttpListener<User>() {
@Override
public void onSuccess(User user, Response<User> response) {
response.printInfo();
HttpUtil.showTips(activity, "Json Convertor", "FastJson handle this: \n" + user.toString());
needRestore = true;
}
}));
// json model convert used #FastJson
liteHttp.performAsync(new StringRequest(userUrl).setHttpListener(new HttpListener<String>() {
@Override
public void onSuccess(String s, Response<String> response) {
User u = Json.get().toObject(s, User.class);
Toast.makeText(activity, u.toString(), Toast.LENGTH_LONG).show();
needRestore = true;
}
@Override
public void onEnd(Response<String> response) {
needRestore = true;
}
}));
break;
case 9:
// 9. File/Bitmap Download
final ProgressDialog downProgress = new ProgressDialog(this);
downProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
downProgress.setIndeterminate(false);
downProgress.show();
// load and show bitmap
liteHttp.executeAsync(
new BitmapRequest(picUrl).setHttpListener(new HttpListener<Bitmap>(true, true, false) {
@Override
public void onLoading(AbstractRequest<Bitmap> request, long total, long len) {
downProgress.setMax((int) total);
downProgress.setProgress((int) len);
HttpLog.i(TAG, total + " total " + len + " len");
}
@Override
public void onSuccess(Bitmap bitmap, Response<Bitmap> response) {
downProgress.dismiss();
AlertDialog.Builder b = HttpUtil.dialogBuilder(activity, "Bitmap Download", "");
ImageView iv = new ImageView(activity);
iv.setImageBitmap(bitmap);
b.setView(iv);
b.show();
}
@Override
public void onFailure(HttpException e, Response<Bitmap> response) {
downProgress.dismiss();
HttpUtil.showTips(activity, "Bitmap Download", e.toString());
}
}));
// download a file to sdcard.
liteHttp.executeAsync(new FileRequest(fileUrl1, "sdcard/aaa.jpg"));
liteHttp.executeAsync(new FileRequest(userUrl, "sdcard/user.txt"));
break;
case 10:
// 10. File Upload
final ProgressDialog upProgress = new ProgressDialog(this);
upProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
upProgress.setIndeterminate(false);
upProgress.show();
StringRequest uploadRequest = new StringRequest(uploadUrl);
uploadRequest.setMethod(HttpMethods.Post)
.setHttpBody(new FileBody(new File("/sdcard/aaa.jpg")))
.setHttpListener(new HttpListener<String>(true, false, true) {
@Override
public void onSuccess(String s, Response<String> response) {
upProgress.dismiss();
HttpUtil.showTips(activity, "Upload Success", s);
response.printInfo();
}
@Override
public void onFailure(HttpException e, Response<String> response) {
upProgress.dismiss();
HttpUtil.showTips(activity, "Upload Failed", e.toString());
}
@Override
public void onUploading(AbstractRequest<String> request, long total, long len) {
upProgress.setMax((int) total);
upProgress.setProgress((int) len);
}
});
liteHttp.executeAsync(uploadRequest);
break;
case 11:
// 11. Disable Some Network
HttpConfig config = liteHttp.getConfig();
// must set context
config.setContext(activity);
// disable mobile(2G/3G/4G) and wifi network
config.setDisableNetworkFlags(HttpConfig.FLAG_NET_DISABLE_MOBILE | HttpConfig.FLAG_NET_DISABLE_WIFI);
liteHttp.executeAsync(new StringRequest(url).setHttpListener(new HttpListener<String>() {
@Override
public void onSuccess(String s, Response<String> response) {
HttpUtil.showTips(activity, "Disable Network", s);
}
@Override
public void onFailure(HttpException e, Response<String> response) {
HttpUtil.showTips(activity, "Network Disabled", e.toString());
}
}));
needRestore = true;
break;
case 12:
// 12. Traffic/Time Statistics
// turn on
liteHttp.getConfig().setDoStatistics(true);
// see detail
liteHttp.executeAsync(new FileRequest(picUrl).setHttpListener(new HttpListener<File>() {
@Override
public void onSuccess(File file, Response<File> response) {
String msg = "This request take time:" + response.getUseTime()
+ ", readed length:" + response.getReadedLength();
msg += " Global " + liteHttp.getStatisticsInfo();
HttpUtil.showTips(activity, "Traffic/Time Statistics", msg);
response.getRedirectTimes(); // 重定向的次数
response.getRetryTimes(); // 重试的次数
response.getUseTime(); // 耗时
response.getContentLength(); // header中的数据长度(Content-Length)
response.getReadedLength(); // 实际读取的数据长度
StatisticsInfo sta = liteHttp.getStatisticsInfo();
sta.getConnectTime(); // litehttp 实例化后所有请求耗时累计
sta.getDataLength(); // litehttp 实例化后读取数据长度累计
}
@Override
public void onFailure(HttpException e, Response<File> response) {
HttpUtil.showTips(activity, "Traffic/Time Statistics", e.toString());
}
}));
break;
case 13:
// 13. Retry/Redirect
// default retry times
liteHttp.getConfig().setDefaultMaxRetryTimes(2);
// default redirect times
liteHttp.getConfig().setDefaultMaxRedirectTimes(4);
// default retry waitting time
// make request
StringRequest redirect = new StringRequest(redirectUrl)
.setMaxRetryTimes(1) // maximum retry times
.setMaxRedirectTimes(5) // maximum redirect times
.setHttpListener(new HttpListener<String>() {
@Override
public void onRedirect(AbstractRequest<String> request, int max, int times) {
Toast.makeText(activity, "Redirect max num: " + max + " , times: " + times
+ "\n GO-TO: " + request.getUri(), Toast.LENGTH_LONG).show();
}
@Override
public void onRetry(AbstractRequest<String> request, int max, int times) {
Toast.makeText(activity, "Retry Now! max num: " + max + " , times: " + times
, Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(String s, Response<String> response) {
HttpUtil.showTips(activity, "Retry/Redirect", "Content Length: " + s.length());
}
});
liteHttp.executeAsync(redirect);
break;
case 14:
// 14. Best Practices of Exception Handling
class MyHttpListener<T> extends HttpListener<T> {
private Activity activity;
public MyHttpListener(Activity activity) {
this.activity = activity;
}
// disable listener when activity is null or be finished.
@Override
public boolean disableListener() {
return activity == null || activity.isFinishing();
}
// handle by this by call super.onFailure()
@Override
public void onFailure(HttpException e, Response response) {
// handle exception
new MyHttpExceptHandler(activity).handleException(e);
}
}
liteHttp.executeAsync(new StringRequest("http://baidu.com").setHttpListener(
new MyHttpListener<String>(activity) {
@Override
public void onFailure(HttpException e, Response response) {
// handle by this by call super.onFailure()
super.onFailure(e, response);
// 通过调用父类的处理方法,来调用 MyHttpExceptHandler 来处理异常。
}
}));
break;
case 15:
// 15. Best Practices of Cancel Request
StringRequest stringRequest = new StringRequest(redirectUrl).setHttpListener(
new HttpListener<String>() {
@Override
public void onCancel(String s, Response<String> response) {
HttpUtil.showTips(
activity, "Cancel Request",
"Request Canceld: " + response.getRequest().isCancelled());
}
});
liteHttp.executeAsync(stringRequest);
SystemClock.sleep(100);
stringRequest.cancel();
break;
case 16:
// 16. POST Multi-Form Data
final ProgressDialog postProgress = new ProgressDialog(this);
postProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
postProgress.setIndeterminate(false);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("POST DATA TEST");
String[] array = new String[]{
"字符串上传",
"UrlEncodedForm上传",
"对象自动转JSON上传",
"对象序列化后上传",
"字节上传",
"单文件上传",
"单输入流上传",
"多文件(表单)上传"
};
//String[] array = getResources().getStringArray(R.array.http_test_post);
final StringRequest postRequest = new StringRequest(uploadUrl)
.setMethod(HttpMethods.Post)
.setHttpListener(new HttpListener<String>(true, false, true) {
@Override
public void onStart(AbstractRequest<String> request) {
super.onStart(request);
postProgress.show();
}
@Override
public void onUploading(AbstractRequest<String> request, long total, long len) {
postProgress.setMax((int) total);
postProgress.setProgress((int) len);
}
@Override
public void onEnd(Response<String> response) {
postProgress.dismiss();
if (response.isConnectSuccess()) {
HttpUtil.showTips(activity, "Upload Success", response.getResult() + "");
} else {
HttpUtil.showTips(activity, "Upload Failure", response.getException() + "");
}
response.printInfo();
}
});
builder.setItems(array, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
postRequest.setHttpBody(new StringBody("hello lite: 你好,Lite!"));
break;
case 1:
LinkedList<NameValuePair> pList = new LinkedList<NameValuePair>();
pList.add(new NameValuePair("key1", "value-haha"));
pList.add(new NameValuePair("key2", "value-hehe"));
postRequest.setHttpBody(new UrlEncodedFormBody(pList));
break;
case 2:
postRequest.setHttpBody(new JsonBody(new UserParam(168, "haha-key")));
break;
case 3:
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
postRequest.setHttpBody(new SerializableBody(list));
break;
case 4:
postRequest.setHttpBody(new ByteArrayBody(new byte[]{1, 2, 3, 4, 5, 15, 18, 127}));
break;
case 5:
postRequest.setHttpBody(new FileBody(new File("/sdcard/aaa.jpg")));
break;
case 6:
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("/sdcard/user.txt"));
} catch (Exception e) {
e.printStackTrace();
}
postRequest.setHttpBody(new InputStreamBody(fis));
break;
case 7:
fis = null;
try {
fis = new FileInputStream(new File("/sdcard/user.txt"));
} catch (Exception e) {
e.printStackTrace();
}
MultipartBody body = new MultipartBody();
body.addPart(new StringPart("key1", "hello"));
body.addPart(new StringPart("key2", "很高兴见到你", "utf-8", null));
body.addPart(new BytesPart("key3", new byte[]{1, 2, 3}));
body.addPart(new FilePart("pic", new File("/sdcard/aaa.jpg"), "image/jpeg"));
body.addPart(new InputStreamPart("litehttp", fis, "user.txt", "text/plain"));
postRequest.setHttpBody(body);
break;
}
liteHttp.executeAsync(postRequest);
}
});
AlertDialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(true);
dialog.show();
break;
case 17:
// 17. Concurrent and Scheduling
HttpConfig httpConfig = liteHttp.getConfig();
// only one task can be executed at the same time
httpConfig.setConcurrentSize(1);
// at most two tasks be hold in waiting queue at the same time
httpConfig.setWaitingQueueSize(2);
// the last waiting task executed first
httpConfig.setSchedulePolicy(SchedulePolicy.LastInFirstRun);
// when task more than 3(current = 1, waiting = 2), new task will be discard.
httpConfig.setOverloadPolicy(OverloadPolicy.DiscardCurrentTask);
// note : restore config to default, next click.
needRestore = true;
// by [DiscardCurrentTask Policy] the last will be discard.
for (int i = 0; i < 4; i++) {
liteHttp.executeAsync(new StringRequest(url).setTag(i));
}
// submit order : 0 -> 1 -> 2 -> 3
// task 0 is executing, 1 and 2 is in waitting queue, 3 was discarded.
// real executed order: 0 -> 2 -> 1
break;
case 18:
// 18. Detail of Configuration
// init common headers for all request
List<NameValuePair> headers = new ArrayList<NameValuePair>();
headers.add(new NameValuePair("cookies", "this is cookies"));
headers.add(new NameValuePair("custom-key", "custom-value"));
HttpConfig newConfig = liteHttp.getConfig();
// app context(be used to detect network and get app files path)
newConfig.setContext(activity);
// the log is turn on when debugged is true
newConfig.setDebugged(true);
// set user-agent
newConfig.setUserAgent("Mozilla/5.0");
// set global http listener to all request
newConfig.setGlobalHttpListener(null);
// set global scheme and host to all request.
newConfig.setBaseUrl("http://litesuits.com");
// common headers will be set to all request
newConfig.setCommonHeaders(headers);
// set default cache path to all request
newConfig.setDefaultCacheDir(Environment.getExternalStorageDirectory() + "/a-cache");
// set default cache expire time to all request
newConfig.setDefaultCacheExpireMillis(30 * 60 * 1000);
// set default cache mode to all request
newConfig.setDefaultCacheMode(CacheMode.NetFirst);
// set default charset to all request
newConfig.setDefaultCharSet("utf-8");
// set default http method to all request
newConfig.setDefaultHttpMethod(HttpMethods.Get);
// set default maximum redirect-times to all request
newConfig.setDefaultMaxRedirectTimes(5);
// set default maximum retry-times to all request
newConfig.setDefaultMaxRetryTimes(1);
// set defsult model query builder to all request
newConfig.setDefaultModelQueryBuilder(new JsonQueryBuilder());
// whether to detect network before conneting.
newConfig.setDetectNetwork(true);
// disable some network
newConfig.setDisableNetworkFlags(HttpConfig.FLAG_NET_DISABLE_NONE);
// whether open the traffic & time statistics
newConfig.setDoStatistics(true);
// set connect timeout: 10s
newConfig.setConnectTimeout(10000);
// set socket timeout: 10s
newConfig.setSocketTimeout(10000);
// if the network is unstable, wait 3000 milliseconds then start retry.
newConfig.setRetrySleepMillis(3000);
// set maximum size of memory cache space
newConfig.setMaxMemCacheBytesSize(1024 * 300);
// maximum number of concurrent tasks(http-request) at the same time
newConfig.setConcurrentSize(3);
// maximum number of waiting tasks(http-request) at the same time
newConfig.setWaitingQueueSize(100);
// set overload policy of thread pool executor
newConfig.setOverloadPolicy(OverloadPolicy.DiscardOldTaskInQueue);
// set schedule policy of thread pool executor
newConfig.setSchedulePolicy(SchedulePolicy.LastInFirstRun);
break;
case 19:
// 19. Usage of Annotation
@HttpUri(userUrl)
@HttpMethod(HttpMethods.Get)
@HttpID(1)
@HttpCacheMode(CacheMode.CacheFirst)
@HttpCacheExpire(value = 1, unit = TimeUnit.MINUTES)
class UserAnnoParam implements HttpParamModel {
public long id = 110;
private String key = "aes";
}
liteHttp.executeAsync(new JsonRequest<User>(
new UserAnnoParam(), User.class) {}.setHttpListener(
new HttpListener<User>() {
@Override
public void onSuccess(User user, Response<User> response) {
HttpUtil.showTips(activity, "Annotation Param", user.toString());
}
}));
break;
case 20:
// 20. Multi Cache Mechanism
StringRequest cacheRequest = new StringRequest(url);
cacheRequest.setCacheMode(CacheMode.CacheFirst);
cacheRequest.setCacheExpire(30, TimeUnit.SECONDS);
cacheRequest.setCacheDir("/sdcard/lite");
cacheRequest.setCacheKey(null);
cacheRequest.setHttpListener(new HttpListener<String>() {
@Override
public void onSuccess(String html, Response<String> response) {
String title = response.isCacheHit() ? "Hit Cache(使用缓存)" : "No Cache(未用缓存)";
HttpUtil.showTips(activity, title, html);
}
});
liteHttp.executeAsync(cacheRequest);
break;
case 21:
// 21. CallBack Mechanism
// the correct way to set global http listener for all request.
liteHttp.getConfig().setGlobalHttpListener(globalHttpListener);
/**
* new http listener for current request:
*
* runOnUiThread = false;
* readingNotify = false;
* uploadingNotify = false;
*
* actually you can set a series of http listener for one http request.
*/
HttpListener<Bitmap> firstHttpListener = new HttpListener<Bitmap>(false, false, false) {
@Override
public void onSuccess(Bitmap bitmap, Response<Bitmap> response) {
HttpLog.i(TAG, "first Listener, request success ...");
}
@Override
public void onFailure(HttpException e, Response<Bitmap> response) {
HttpLog.i(TAG, "first Listener, request failure ...");
}
@Override
public void onLoading(AbstractRequest<Bitmap> request, long total, long len) {
HttpLog.i(TAG, "first Listener, request loading ...");
}
};
// create a bitmap request.
BitmapRequest bitmapRequest = new BitmapRequest(picUrl);
// correct way to set first http listener
bitmapRequest.setHttpListener(firstHttpListener);
// correct way to set secondary (linked)listener
firstHttpListener.setLinkedListener(secondaryListener);
//load and show bitmap
liteHttp.executeAsync(bitmapRequest);
break;
case 22:
// 22. Best Practices of SmartExecutor
//可定义等待队列进入执行状态的策略:先来先执行,后来先执行。
//可定义等待队列满载后处理新请求的策略:
//- 抛弃队列中最新的任务
//- 抛弃队列中最旧的任务
//- 抛弃当前新任务
//- 直接执行(阻塞当前线程)
//- 抛出异常(中断当前线程)
// 智能并发调度控制器:设置[最大并发数],和[等待队列]大小
SmartExecutor smallExecutor = new SmartExecutor();
// set this temporary parameter, just for test
// number of concurrent threads at the same time, recommended core size is CPU count
smallExecutor.setCoreSize(2);
// adjust maximum number of waiting queue size by yourself or based on phone performance
smallExecutor.setQueueSize(2);
// 任务数量超出[最大并发数]后,自动进入[等待队列],等待当前执行任务完成后按策略进入执行状态:后进先执行。
smallExecutor.setSchedulePolicy(SchedulePolicy.LastInFirstRun);
// 后续添加新任务数量超出[等待队列]大小时,执行过载策略:抛弃队列内最旧任务。
smallExecutor.setOverloadPolicy(OverloadPolicy.DiscardOldTaskInQueue);
// 一次投入 4 个任务
for (int i = 0; i < 4; i++) {
final int j = i;
smallExecutor.execute(new Runnable() {
@Override
public void run() {
HttpLog.i(TAG, " TASK " + j + " is running now ----------->");
SystemClock.sleep(j * 200);
}
});
}
// 再投入1个需要取消的任务
Future future = smallExecutor.submit(new Runnable() {
@Override
public void run() {
HttpLog.i(TAG, " TASK 4 will be canceled ... ------------>");
SystemClock.sleep(1000);
}
});
future.cancel(false);
break;
case 23:
// 23. Automatic Conversion of Complex Model
// 实现登陆,参数为 name 和 password,成功后返回 User 对象。
@HttpUri(loginUrl)
class LoginParam extends HttpRichParamModel<User> {
private String name;
private String password;
public LoginParam(String name, String password) {
this.name = name;
this.password = password;
}
}
// 模拟用户登录
liteHttp.executeAsync(new LoginParam("lucy", "123456").setHttpListener(
new HttpListener<User>() {
@Override
public void onSuccess(User user, Response<User> response) {
HttpUtil.showTips(activity, "Json Convertor", user.toString());
}
@Override
public void onFailure(HttpException e, Response<User> response) {
HttpUtil.showTips(activity, "Json Convertor", e.getMessage());
}
}
));
break;
case 24:
// 24. Best Practice: HTTP Rich Param Model (It is simpler and More Useful)
// rich param 更简单、有用!只需要定义一个RichParam,可指定URL、参数、返回响应体三个关键事物。
// request : http://litesuits.com/mockdata/user_get?id=110&key=aes-125
// response: User
@HttpUri("{url}/{path}")
class UserRichParam extends HttpRichParamModel<User> {
@NonHttpParam
@HttpReplace("url")
private String url = "http://litesuits.com";
@NonHttpParam
@HttpReplace("path")
private String path = "/mockdata/user_get";
public long id = 110;
private String key = "aes-125";
}
// 一句话调用即可
liteHttp.executeAsync(new UserRichParam());
// 其他更多注解还有:
@HttpBaseUrl("{host}") // 定义scheme,使用host变量的值取代
@HttpUri("{path}") // 定义uri 或者 path
@HttpMethod(HttpMethods.Get) // 请求方式
@HttpCharSet("UTF-8") // 请求编码
@HttpTag("custom tag") // 打TAG
@HttpCacheMode(CacheMode.CacheFirst) // 缓存模式
@HttpCacheKey("custom-cache-key-name-by-myself") // 缓存文件名字
@HttpCacheExpire(value = 1, unit = TimeUnit.MINUTES) // 缓存时间
@HttpID(2) // 请求ID
@HttpMaxRetry(3) // 重试次数
@HttpMaxRedirect(5) // 重定向次数
class TEST extends HttpRichParamModel<User> {
@NonHttpParam
@HttpReplace("host")
private String host = "http://litesuits.com";
@HttpReplace("path")
private String apiPath = "/mockdata/user_get";
// 可以复写设置headers/attachToUrl/listener/httpbody 等参数
/**
* 返回true则将将成员变量{@link #host}、{@link #apiPath}拼接到url中
* 返回false,则不拼接。
* @return
*/
@Override
public boolean isFieldsAttachToUrl() {
return false;
}
@Override
protected LinkedHashMap<String, String> createHeaders() {
return super.createHeaders();
}
@Override
protected HttpListener<User> createHttpListener() {
return super.createHttpListener();
}
@Override
protected HttpBody createHttpBody() {
return super.createHttpBody();
}
}
liteHttp.executeAsync(new TEST().setHttpListener(new HttpListener<User>() {
@Override
public void onSuccess(User user, Response<User> response) {
HttpUtil.showTips(activity, "Rich Param Model", user.toString());
}
}));
break;
}
}
/**
* global http listener for all request.
*/
GlobalHttpListener globalHttpListener = new GlobalHttpListener() {
@Override
public void onStart(AbstractRequest<?> request) {
HttpLog.i(TAG, "Global, request start ...");
}
@Override
public void onSuccess(Object data, Response<?> response) {
HttpLog.i(TAG, "Global, request success ..." + data);
}
@Override
public void onFailure(HttpException e, Response<?> response) {
HttpLog.i(TAG, "Global, request failure ..." + e);
}
@Override
public void onCancel(Object data, Response<?> response) {
HttpLog.i(TAG, "Global, request cancel ..." + data);
}
};
/**
* http listener for current reuqest:
*
* runOnUiThread = true;
* readingNotify = true;
* uploadingNotify = true;
*/
HttpListener<Bitmap> secondaryListener = new HttpListener<Bitmap>(true, true, true) {
ProgressDialog progressDialog = null;
@Override
public void onStart(AbstractRequest<Bitmap> request) {
HttpLog.i(TAG, "second listener, request start ...");
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setIndeterminate(false);
progressDialog.show();
}
@Override
public void onSuccess(Bitmap bitmap, Response<Bitmap> response) {
HttpLog.i(TAG, "second listener, request success ...");
progressDialog.dismiss();
ImageView iv = new ImageView(activity);
iv.setImageBitmap(bitmap);
HttpUtil.dialogBuilder(activity, "LiteHttp2.0", "")
.setView(iv).show();
}
@Override
public void onFailure(HttpException e, Response<Bitmap> response) {
HttpLog.i(TAG, " second listener, request failure ...");
progressDialog.dismiss();
}
@Override
public void onLoading(AbstractRequest<Bitmap> request, long total, long len) {
HttpLog.i(TAG, " second listener, request loading ...");
progressDialog.setMax((int) total);
progressDialog.setProgress((int) len);
}
};
}