xUtils簡介
- xUtils 包含了很多實用的android工具。
- xUtils 最初源於Afinal框架,進行了大量重構,使得xUtils支持大文件上傳,更全面的http請求協議支持(10種謂詞),擁有更加靈活的ORM,更多的事件註解支持且不受混淆影響…
- xUitls最低兼容android 2.2 (api level 8)
- 目前xUtils主要有四大模塊:
DbUtils模塊:
- android中的orm框架,一行代碼就可以進行增刪改查;
- 支持事務,默認關閉;
- 可通過註解自定義表名,列名,外鍵,唯一性約束,NOT NULL約束,CHECK約束等(需要混淆的時候請註解表名和列名);
- 支持綁定外鍵,保存實體時外鍵關聯實體自動保存或更新;
- 自動加載外鍵關聯實體,支持延時加載;
- 支持鏈式表達查詢,更直觀的查詢語義,參考下面的介紹或sample中的例子。
-
ViewUtils模塊:
- android中的ioc框架,完全註解方式就可以進行UI,資源和事件綁定;
- 新的事件綁定方式,使用混淆工具混淆後仍可正常工作;
- 目前支持常用的20種事件綁定,參見ViewCommonEventListener類和包com.lidroid.xutils.view.annotation.event。
-
HttpUtils模塊:
- 支持同步,異步方式的請求;
- 支持大文件上傳,上傳大文件不會oom;
- 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT請求;
- 下載支持301/302重定向,支持設置是否根據Content-Disposition重命名下載的文件;
- 返回文本內容的請求(默認只啓用了GET請求)支持緩存,可設置默認過期時間和針對當前請求的過期時間。
-
BitmapUtils模塊:
- 加載bitmap的時候無需考慮bitmap加載過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象;
- 支持加載網絡圖片和本地圖片;
- 內存管理使用lru算法,更好的管理bitmap內存;
- 可配置線程加載線程數量,緩存大小,緩存路徑,加載顯示動畫等…
使用xUtils快速開發框架需要有以下權限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
混淆時注意事項:
- 添加Android默認混淆配置${sdk.dir}/tools/proguard/proguard-android.txt
- 不要混淆xUtils中的註解類型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }
- 對使用DbUtils模塊持久化的實體類不要混淆,或者註解所有表和列名稱@Table(name=”xxx”),@Id(column=”xxx”),@Column(column=”xxx”),@Foreign(column=”xxx”,foreign=”xxx”);
DbUtils使用方法:
DbUtils db = DbUtils.create(this);
User user = new User(); //這裏需要注意的是User對象必須有id屬性,或者有通過@ID註解的屬性
user.setEmail("[email protected]");
user.setName("wyouflf");
db.save(user); // 使用saveBindingId保存實體時會爲實體的id賦值
...
// 查找
Parent entity = db.findById(Parent.class, parent.getId());
List<Parent> list = db.findAll(Parent.class);//通過類型查找
Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));
// IS NULL
Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));
// IS NOT NULL
Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));
// WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffset
List<Parent> list = db.findAll(Selector.from(Parent.class)
.where("id" ,"<", 54)
.and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))
.orderBy("id")
.limit(pageSize)
.offset(pageSize * pageIndex));
// op爲"in"時,最後一個參數必須是數組或Iterable的實現類(例如List等)
Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));
// op爲"between"時,最後一個參數必須是數組或Iterable的實現類(例如List等)
Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));
DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")只取出name列
List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));
...
List<DbModel> dbModels = db.findDbModelAll(sql); // 自定義sql查詢
db.execNonQuery(sql) // 執行自定義sql
...
ViewUtils使用方法
- 完全註解方式就可以進行UI綁定和事件綁定。
- 無需findViewById和setClickListener等。
// xUtils的view註解要求必須提供id,以使代碼混淆不受影響。
@ViewInject(R.id.textView)
TextView textView;
//@ViewInject(vale=R.id.textView, parentId=R.id.parentView)
//TextView textView;
@ResInject(id = R.string.label, type = ResType.String)
private String label;
// 取消了之前使用方法名綁定事件的方式,使用id綁定不受混淆影響
// 支持綁定多個id @OnClick({R.id.id1, R.id.id2, R.id.id3})
// or @OnClick(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
// 更多事件支持參見ViewCommonEventListener類和包com.lidroid.xutils.view.annotation.event。
@OnClick(R.id.test_button)
public void testButtonClick(View v) { // 方法簽名必須和接口中的要求一致
...
}
...
//在Activity中注入:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewUtils.inject(this); //注入view和事件
...
textView.setText("some text...");
...
}
//在Fragment中注入:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加載fragment佈局
ViewUtils.inject(this, view); //注入view和事件
...
}
//在PreferenceFragment中注入:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件
...
}
// 其他重載
// inject(View view);
// inject(Activity activity)
// inject(PreferenceActivity preferenceActivity)
// inject(Object handler, View view)
// inject(Object handler, Activity activity)
// inject(Object handler, PreferenceGroup preferenceGroup)
// inject(Object handler, PreferenceActivity preferenceActivity)
HttpUtils使用方法:
普通get方法
HttpUtils http = new HttpUtils();
http.send(HttpRequest.HttpMethod.GET,
"http://www.lidroid.com",
new RequestCallBack<String>(){
@Override
public void onLoading(long total, long current, boolean isUploading) {
testTextView.setText(current + "/" + total);
}
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
textView.setText(responseInfo.result);
}
@Override
public void onStart() {
}
@Override
public void onFailure(HttpException error, String msg) {
}
});
使用HttpUtils上傳文件 或者 提交數據 到服務器(post方法)
RequestParams params = new RequestParams();
params.addHeader("name", "value");
params.addQueryStringParameter("name", "value");
// 只包含字符串參數時默認使用BodyParamsEntity,
// 類似於UrlEncodedFormEntity("application/x-www-form-urlencoded")。
params.addBodyParameter("name", "value");
// 加入文件參數後默認使用MultipartEntity("multipart/form-data"),
// 如需"multipart/related",xUtils中提供的MultipartEntity支持設置subType爲"related"。
// 使用params.setBodyEntity(httpEntity)可設置更多類型的HttpEntity(如:
// MultipartEntity,BodyParamsEntity,FileUploadEntity,InputStreamUploadEntity,StringEntity)。
// 例如發送json參數:params.setBodyEntity(new StringEntity(jsonStr,charset));
params.addBodyParameter("file", new File("path"));
...
HttpUtils http = new HttpUtils();
http.send(HttpRequest.HttpMethod.POST,
"uploadUrl....",
params,
new RequestCallBack<String>() {
@Override
public void onStart() {
testTextView.setText("conn...");
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
if (isUploading) {
testTextView.setText("upload: " + current + "/" + total);
} else {
testTextView.setText("reply: " + current + "/" + total);
}
}
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
testTextView.setText("reply: " + responseInfo.result);
}
@Override
public void onFailure(HttpException error, String msg) {
testTextView.setText(error.getExceptionCode() + ":" + msg);
}
});
使用HttpUtils下載文件:
- 支持斷點續傳,隨時停止下載任務,開始任務
HttpUtils http = new HttpUtils();
HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",
"/sdcard/httpcomponents-client-4.2.5-src.zip",
true, // 如果目標文件存在,接着未完成的部分繼續下載。服務器不支持RANGE時將從新下載。
true, // 如果從請求返回信息中獲取到文件名,下載完成後自動重命名。
new RequestCallBack<File>() {
@Override
public void onStart() {
testTextView.setText("conn...");
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
testTextView.setText(current + "/" + total);
}
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
testTextView.setText("downloaded:" + responseInfo.result.getPath());
}
@Override
public void onFailure(HttpException error, String msg) {
testTextView.setText(msg);
}
});
...
//調用cancel()方法停止下載
handler.cancel();
BitmapUtils 使用方法
BitmapUtils bitmapUtils = new BitmapUtils(this);
// 加載網絡圖片
bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");
// 加載本地圖片(路徑以/開頭, 絕對路徑)
bitmapUtils.display(testImageView, "/sdcard/test.jpg");
// 加載assets中的圖片(路徑以assets開頭)
bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");
// 使用ListView等容器展示圖片時可通過PauseOnScrollListener控制滑動和快速滑動過程中時候暫停加載圖片
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));
下面依次開始介紹這些組件具體的使用。
一、ViewUtils android中得ioc(控制反轉)框架,可以完全使用註解的方式來完成UI的綁定和事件綁定。簡單的說,ViewUtils的功能就是做這個的,但是可以說,就這麼個功能確是能極大的簡化我們的代碼。下面我們看下具體的代碼,順便對比下註解的方式綁定ID和findViewById之間的差別。
- @ViewInject(R.id.btn)
- private Button btn;
- @ViewInject(R.id.img)
- private ImageView img;
- @ViewInject(R.id.list)
- private ListView list;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_second);
- ViewUtils.inject(this);}
@ViewInject(R.id.btn)
private Button btn;
@ViewInject(R.id.img)
private ImageView img;
@ViewInject(R.id.list)
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ViewUtils.inject(this);}
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_second);
- btn = (Button) findViewById(R.id.btn);
- img = (ImageView) findViewById(R.id.img);
- list = (ListView) findViewById(R.id.list);
- }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn = (Button) findViewById(R.id.btn);
img = (ImageView) findViewById(R.id.img);
list = (ListView) findViewById(R.id.list);
}
如果項目中得Activity中的控件相當多,那麼想象一下代碼中累積的那一大坨就真心受不了。通過xUtils的簡單註解,就能輕鬆擺脫無盡壞味道的代碼。
注意:在使用註解綁定控件的時候,一定記得在onCreate中調用ViewUtils.inject(this);
下面我們再對比下Android中事件綁定的區別。
- @OnClick({ R.id.btn, R.id.img })
- public void clickMethod(View v) {
- Toast.makeText(SecondActivity.this, “you clicked button!”,
- Toast.LENGTH_SHORT).show();
- }
- @OnItemClick(R.id.list)
- public void itemClick(AdapterView<?> parent, View view, int position,long id) {
- Toast.makeText(SecondActivity.this, “position—>“ + position,
- Toast.LENGTH_SHORT).show();
- }
@OnClick({ R.id.btn, R.id.img })
public void clickMethod(View v) {
Toast.makeText(SecondActivity.this, "you clicked button!",
Toast.LENGTH_SHORT).show();
}
@OnItemClick(R.id.list)
public void itemClick(AdapterView<?> parent, View view, int position,long id) {
Toast.makeText(SecondActivity.this, "position--->" + position,
Toast.LENGTH_SHORT).show();
}
- btn.setOnClickListener(this);
- list.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- Toast.makeText(SecondActivity.this, “position—>“ + position,
- Toast.LENGTH_SHORT).show();
- }
- });
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn:
- Toast.makeText(SecondActivity.this, “you clicked button!”,
- Toast.LENGTH_SHORT).show();
- break;
- default:
- break;
- }
- }
btn.setOnClickListener(this);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(SecondActivity.this, "position--->" + position,
Toast.LENGTH_SHORT).show();
}
});
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
Toast.makeText(SecondActivity.this, "you clicked button!",
Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
原本綁定Button的監聽事件要麼用醜陋的內部類,要麼Activity實現OnClickListener,在複寫的onClick方法中去根據id。而xUtils只要通過簡單的一句註解就能實現監聽事件的功能,而且可以實現多個控件共用一個監聽方法。同時xUtils提供onClick、onItemClick、onLongClick等15種事件監聽註解。
注意:在使用註解監聽事件的時候,監聽方法名是自定義的,但是一定要保證方法的訪問修飾符爲public,同時方法的參數要與Android原來的監聽方法參數一致,不僅參數類型,而且要保證參數的順序。
二、BitmapUtils 加載網絡或本地bitmap的時候無需擔心再遇到OOM的現象,管理bitmap的內存採用了LRU算法,同時也能避免列表滑動過程中發生圖片錯位等得現象。加載網絡圖片時,還可以配置運行線程的數量,緩存路徑等。。。通過BitmapUtils的各種構造器,可以很方便的創建出本地緩存路徑和緩存的大小,以及內存緩存的大小。- BitmapUtils utils = new BitmapUtils(this);
- BitmapDisplayConfig config = new BitmapDisplayConfig(this);
- config.setLoadingDrawable(getResources().getDrawable(R.drawable.loading));
- config.setLoadFailedDrawable(getResources().getDrawable(R.drawable.failed));
- config.setImageLoadCallBack(new ImageLoadCallBack() {
- @Override
- public void loadFailed(ImageView imageView, Drawable drawable) {
- }
- @Override
- public void loadCompleted(ImageView imageView, Drawable drawable,
- BitmapDisplayConfig config) {
- }
- });
- config.setBitmapMaxWidth(480);
- config.setBitmapMaxHeight(720);
- utils.display(img, “http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg”);
- utils.display(img, “http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg”, config);
BitmapUtils utils = new BitmapUtils(this);
BitmapDisplayConfig config = new BitmapDisplayConfig(this);
config.setLoadingDrawable(getResources().getDrawable(R.drawable.loading));
config.setLoadFailedDrawable(getResources().getDrawable(R.drawable.failed));
config.setImageLoadCallBack(new ImageLoadCallBack() {
@Override
public void loadFailed(ImageView imageView, Drawable drawable) {
}
@Override
public void loadCompleted(ImageView imageView, Drawable drawable,
BitmapDisplayConfig config) {
}
});
config.setBitmapMaxWidth(480);
config.setBitmapMaxHeight(720);
// utils.display(img, "http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg");
utils.display(img, "http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg", config);
BitmapUtils在用來加載網絡圖片時,可以配置加載圖片尺寸的大小,加載成功和失敗的回調以及加載過程中圖片的配置。同時也可以選擇不配置。- //bitmapUtils.display(testImageView, ”/sdcard/test.jpg”); //支持加載本地圖片
- // 使用ListView等容器展示圖片時可通過PauseOnScrollListener控制滑動和快速滑動過程中時候暫停加載圖片
- listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
- listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true), customListener);
//bitmapUtils.display(testImageView, "/sdcard/test.jpg"); //支持加載本地圖片
// 使用ListView等容器展示圖片時可通過PauseOnScrollListener控制滑動和快速滑動過程中時候暫停加載圖片
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true), customListener);
三、DbUtils操縱數據庫的工具類,無論多牛X,總離不開最根本的CRUD,即創建,查詢,更新和刪除。下面從這四個角度依次介紹xUtils是如何簡便持久化數據的。大家都知道,在Android裏面如果要存儲一個對象,我們需要創建一個SQLiteOpenHelper,然後還得創建一張對應對象各個屬性的表,還得繼續把我們的對象轉換成ContentValues,進而去存儲。真心是麻煩的不能再麻煩了,我們現在介紹的DbUtils就能讓你輕鬆解脫麻繩一樣的代碼。DbUtils在進行save操作的時候,會根據java反射反射出對象的各個字段,然後去查詢數據庫中是否存在這個對象類型對應的表,如果表已經存在,直接進行插入操作;如果不存在,就先動態的創建的一張對應我們對象的表,再進行插入處理。直接上代碼,大家看。- @OnClick(R.id.insert)
- public void insert(View v) {
- Student stu = null;
- for (int i = 0; i < 20; i++) {
- stu = new Student();
- stu.setAge(10 + i);
- stu.setName(“jack” + i);
- mList.add(stu);
- try {
- dbUtils.save(stu);
- } catch (DbException e) {
- e.printStackTrace();
- }
- }
- }
@OnClick(R.id.insert)
public void insert(View v) {
Student stu = null;
for (int i = 0; i < 20; i++) {
stu = new Student();
stu.setAge(10 + i);
stu.setName("jack" + i);
mList.add(stu);
try {
dbUtils.save(stu);
} catch (DbException e) {
e.printStackTrace();
}
}
}
注意:並不是所有的實體對象都快可以通過這種方式去存儲,一定要保證對象的類型中有int類型的id或者_id的屬性,這就對應數據庫表中的主鍵字段。如果類型中沒有id字段,可以通過@Id註解去指定一個int類型的字段作爲主鍵。如果表中的又字段不想被存儲在數據庫中,也可以通過@Transient去實現忽略。如果直接存儲一個對象的列表,這樣也是被允許的,達到批量存儲的目的。
DbUtils可以幫助對SQL語句不是很熟悉的同學快速的實現查詢,而不用去寫sql查詢語句,而且可以對查詢結果進行排序和分頁,使用簡單,功能強大。大家可以看下,下面的幾行代碼就能實現複雜的查詢功能
- dbUtils.findAll(Selector.from(Student.class).where(“_id”, ”<“, 10).and(“age”, ”>“, 10).orderBy(“_id”).limit(pageSize).offset(pageSize * pageIndex));
dbUtils.findAll(Selector.from(Student.class).where("_id", "<", 10).and("age", ">", 10).orderBy("_id").limit(pageSize).offset(pageSize * pageIndex));
同樣的,也可以對數據庫中得數據進行便捷的更新。下面演示的是更新Student對應的表中的第一條記錄的age這個字段。這個比較簡單,就直接上代碼看吧。- @OnClick(R.id.update)
- public void update(View v){
- try {
- List<Student> stus = dbUtils.findAll(Selector.from(Student.class));
- Student stu = stus.get(0);
- stu.setAge(20);
- dbUtils.update(stu);
- } catch (DbException e) {
- e.printStackTrace();
- }
- }
@OnClick(R.id.update)
public void update(View v){
try {
List<Student> stus = dbUtils.findAll(Selector.from(Student.class));
Student stu = stus.get(0);
stu.setAge(20);
dbUtils.update(stu);
} catch (DbException e) {
e.printStackTrace();
}
}
最後一個就是數據的刪除。一個實體對象,一組實體對象,根據條件刪除,刪除表,刪除整個數據庫,這些操作都可以通過一句簡單的代碼來實現,看了代碼就明白了。- @OnClick(R.id.delete)
- public void delete(View v){
- try {
- List<Student> stus = dbUtils.findAll(Selector.from(Student.class));
- dbUtils.delete(stus.get(0));
- dbUtils.deleteAll(stus);
- dbUtils.deleteById(Student.class, WhereBuilder.b(“age”, ”==”, 20));
- dbUtils.dropTable(Student.class);
- dbUtils.dropDb();
- } catch (DbException e) {
- e.printStackTrace();
- }
- }
@OnClick(R.id.delete)
public void delete(View v){
try {
List<Student> stus = dbUtils.findAll(Selector.from(Student.class));
dbUtils.delete(stus.get(0));
dbUtils.deleteAll(stus);
dbUtils.deleteById(Student.class, WhereBuilder.b("age", "==", 20));
dbUtils.dropTable(Student.class);
dbUtils.dropDb();
} catch (DbException e) {
e.printStackTrace();
}
}
四、HttpUtils是解決日常工作過程中繁雜的上傳下載文件以及各種Get和post請求的必備工具類,通過這個類,開源非常方便關注接口的業務,不必再再寫那麼冗長的代碼。下面全文都圍繞着四個中心點去依次展開,分別是:HttpGet請求,HttpPost請求,下載文件和上傳文件。- RequestParams params = new RequestParams();
- params.addQueryStringParameter(“method”, “info”);
- params.addQueryStringParameter(“access_token”,
- “3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414”);
- HttpUtils http = new HttpUtils();
- http.configCurrentHttpGetCacheExpiry(1000 * 10);
- http.send(HttpRequest.HttpMethod.GET,
- “https://pcs.baidu.com/rest/2.0/pcs/quota”,
- params,
- new RequestCallBack<String>() {
- @Override
- public void onStart() {
- resultText.setText(“conn…”);
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + ”/” + total);
- }
- @Override
- public void onSuccess(String result) {
- resultText.setText(“response:” + result);
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(msg);
- }
- });
RequestParams params = new RequestParams();
params.addQueryStringParameter("method", "info");
params.addQueryStringParameter("access_token",
"3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");
HttpUtils http = new HttpUtils();
http.configCurrentHttpGetCacheExpiry(1000 * 10);
http.send(HttpRequest.HttpMethod.GET,
"https://pcs.baidu.com/rest/2.0/pcs/quota",
params,
new RequestCallBack<String>() {
@Override
public void onStart() {
resultText.setText("conn...");
}
@Override
public void onLoading(long total, long current) {
resultText.setText(current + "/" + total);
}
@Override
public void onSuccess(String result) {
resultText.setText("response:" + result);
}
@Override
public void onFailure(HttpException error, String msg) {
resultText.setText(msg);
}
});
- RequestParams params = new RequestParams();
- params.addQueryStringParameter(“method”, “mkdir”);
- params.addQueryStringParameter(“access_token”, “3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414”);
- params.addBodyParameter(“path”, ”/apps/測試應用/test文件夾”);
- HttpUtils http = new HttpUtils();
- http.send(HttpRequest.HttpMethod.POST,
- “https://pcs.baidu.com/rest/2.0/pcs/file”,
- params,
- new RequestCallBack<String>() {
- @Override
- public void onStart() {
- resultText.setText(“conn…”);
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + ”/” + total);
- }
- @Override
- public void onSuccess(String result) {
- resultText.setText(“upload response:” + result);
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(msg);
- }
- });
RequestParams params = new RequestParams();
params.addQueryStringParameter("method", "mkdir");
params.addQueryStringParameter("access_token", "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");
params.addBodyParameter("path", "/apps/測試應用/test文件夾");
HttpUtils http = new HttpUtils();
http.send(HttpRequest.HttpMethod.POST,
"https://pcs.baidu.com/rest/2.0/pcs/file",
params,
new RequestCallBack<String>() {
@Override
public void onStart() {
resultText.setText("conn...");
}
@Override
public void onLoading(long total, long current) {
resultText.setText(current + "/" + total);
}
@Override
public void onSuccess(String result) {
resultText.setText("upload response:" + result);
}
@Override
public void onFailure(HttpException error, String msg) {
resultText.setText(msg);
}
});
- HttpHandler handler = http.download(
- downloadAddrEdit.getText().toString(),
- ”/sdcard/fileexplorer.apk”,
- true, // 如果目標文件存在,接着未完成的部分繼續下載。
- true, // 如果從請求返回信息中獲取到文件名,下載完成後自動重命名。
- new RequestCallBack<File>() {
- @Override
- public void onStart() {
- resultText.setText(“conn…”);
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + ”/” + total);
- }
- @Override
- public void onSuccess(File result) {
- resultText.setText(“downloaded:” + result.getPath());
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(error.getExceptionCode() + ”:” + msg);
- }
- });
HttpHandler handler = http.download(
downloadAddrEdit.getText().toString(),
"/sdcard/fileexplorer.apk",
true, // 如果目標文件存在,接着未完成的部分繼續下載。
true, // 如果從請求返回信息中獲取到文件名,下載完成後自動重命名。
new RequestCallBack<File>() {
@Override
public void onStart() {
resultText.setText("conn...");
}
@Override
public void onLoading(long total, long current) {
resultText.setText(current + "/" + total);
}
@Override
public void onSuccess(File result) {
resultText.setText("downloaded:" + result.getPath());
}
@Override
public void onFailure(HttpException error, String msg) {
resultText.setText(error.getExceptionCode() + ":" + msg);
}
});
注意:下載過程中如果需要暫停下載,也只需簡單的一行代碼來實現:mHandler.stop(),如果設置斷點下載的話,下次會重新開始的話,會自動從上次下載的斷點處繼續下載。- RequestParams params = new RequestParams();
- params.addQueryStringParameter(“method”, “upload”);
- params.addQueryStringParameter(“path”, ”/apps/測試應用/test.zip”);
- // 請在百度的開放access_tokenapi測試頁面找到自己的access_token
- params.addQueryStringParameter(“access_token”, “3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414”);
- params.addBodyParameter(“file”, new File(“/sdcard/test.zip”));
- HttpUtils http = new HttpUtils();
- http.send(HttpRequest.HttpMethod.POST,
- “https://pcs.baidu.com/rest/2.0/pcs/file”,
- params,
- new RequestCallBack<String>() {
- @Override
- public void onStart() {
- resultText.setText(“conn…”);
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + ”/” + total);
- }
- @Override
- public void onSuccess(String result) {
- resultText.setText(“upload response:” + result);
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(msg);
- }
- });
RequestParams params = new RequestParams();
params.addQueryStringParameter("method", "upload");
params.addQueryStringParameter("path", "/apps/測試應用/test.zip");
// 請在百度的開放access_tokenapi測試頁面找到自己的access_token
params.addQueryStringParameter("access_token", "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");
params.addBodyParameter("file", new File("/sdcard/test.zip"));
HttpUtils http = new HttpUtils();
http.send(HttpRequest.HttpMethod.POST,
"https://pcs.baidu.com/rest/2.0/pcs/file",
params,
new RequestCallBack<String>() {
@Override
public void onStart() {
resultText.setText("conn...");
}
@Override
public void onLoading(long total, long current) {
resultText.setText(current + "/" + total);
}
@Override
public void onSuccess(String result) {
resultText.setText("upload response:" + result);
}
@Override
public void onFailure(HttpException error, String msg) {
resultText.setText(msg);
}
});