1. 程式人生 > >XUtils3框架的基本用法(一)

XUtils3框架的基本用法(一)

art put ref undle ret oncreate title 斷點續傳 lis

本文為作者原創,轉載請指明出處:
http://blog.csdn.net/a1002450926/article/details/50341173

今天給大家帶來XUtils3的基本介紹。本文章的案例都是基於XUtils3的API語法進行的演示。相信大家對這個框架也都了解過,以下簡介下XUtils3的一些基本知識。
XUtils3一共同擁有4大功能:註解模塊,網絡模塊。圖片載入模塊。數據庫模塊。
使用XUtils僅僅須要在libs目錄裏面增加一個jar包。假設對server返回的數據進行封裝的話,還須要導入一個Gson的jar包。
所需權限:

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

註解模塊

Activity的註解
1.在Application的oncreate方法中增加以下代碼:
x.Ext.init(this);
2.在Activity的oncreate方法中增加以下代碼:
x.view().inject(this);
3.載入當前的Activity布局須要例如以下註解:
@ContentView增加到Activity的上方
4.給View進行初始化須要例如以下註解:
@InjectView
5.處理控件的各種響應事件須要例如以下註解:
@Envent
示比例如以下:

    @ContentView(R.layout.activity_main)
public class MainActivity extends ActionBarActivity {

    @ViewInject(R.id.btn_get)
    Button btn_get;
    @ViewInject(R.id.btn_post)
    Button btn_post;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
x.view().inject(this); btn_get.setText("發送get請求"); btn_post.setText("發送post請求"); } [email protected](value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class) @Event(value={R.id.btn_get,R.id.btn_post}) private void getEvent(View view){ switch(view.getId()){ case R.id.btn_get: Toast.makeText(MainActivity.this, btn_get.getText().toString().trim(), 0).show(); break; case R.id.btn_post: Toast.makeText(MainActivity.this, btn_post.getText().toString().trim(), 0).show(); break; } }

通過測試,我們發現當點擊btn_getbutton時。彈出了“發送get請求”的效果。到這裏,大家算是對XUtils的註解有個一個主要的認識,以下我在強調一點的是,@Event這個註解默認情況下type屬性為View.OnClickListener.class.假設你想實現其余點擊事件效果,僅僅須要把type值進行改動就可以。
另外須要註意的一點是button的點擊事件必須用private進行修飾。

Fragment的註解:

@ContentView(R.layout.fragment_first)  
public class FirstFragment extends Fragment{  
    private MyAdapter adapter;
    private List<Person> list=new ArrayList<>();  
    private List<String> listUrl=new ArrayList<>();  
    private List<String> listName=new ArrayList<>();    

    @ViewInject(R.id.btn_test)
    Button btn_test;
    @ViewInject(R.id.listView)
    ListView listView;

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return  x.view().inject(this, inflater, container);
    } 

ViewHolder的註解:

    public class MyAdapter extends  BaseAdapter{
    private Context context;
    private List<Person> list;
    private LayoutInflater mInflater;
    private ImageOptions options;
    public ViewHolder holder;
    public MyAdapter(Context context, List<Person> list) {
        this.context = context;
        this.list = list;
        this.mInflater=LayoutInflater.from(context);
        options=new ImageOptions.Builder().setLoadingDrawableId(R.drawable.ic_launcher)
                .setLoadingDrawableId(R.drawable.ic_launcher).setUseMemCache(true).setCircular(true).build();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        holder=null;
        if(convertView==null){
            convertView=mInflater.inflate(R.layout.itemone, null);
            holder=new ViewHolder();
            x.view().inject(holder,convertView);
            convertView.setTag(holder);
        }
        else{
            holder=(ViewHolder) convertView.getTag();
        }
        Person bean=list.get(position);
        holder.tv_name.setText(bean.getName());
        x.image().bind(holder.iv_image, bean.getImgUrl(), options);
        return convertView;
    }

    class ViewHolder{
        @ViewInject(R.id.tv_name)
        private TextView tv_name;
        @ViewInject(R.id.iv_image)
        private ImageView iv_image;
    }

上面的代碼是註解ViewHolder的標準模式,相信大家全然能夠看明確。這裏我載入圖片使用到了XUtils3的載入網絡圖片的方法。後面我會具體進行解說。

網絡模塊

XUtils的網絡請求方法和一些網絡請求框架的使用方法很相似,我進行了一些簡單的封裝。
封裝一共同擁有3個文件。各自是網絡請求工具類XUtil,請求響應數據的解析類。另一個就是一個請求成功的一個接口回調類。
代碼例如以下:

public class XUtil {
    /**
     * 發送get請求
     * @param <T>
     */
    public static <T> Cancelable Get(String url,Map<String,String> map,CommonCallback<T> callback){
        RequestParams params=new RequestParams(url);
        if(null!=map){
            for(Map.Entry<String, String> entry : map.entrySet()){
                params.addQueryStringParameter(entry.getKey(), entry.getValue());
            }
        }
        Cancelable cancelable = x.http().get(params, callback);
        return cancelable;
    }

    /**
     * 發送post請求
     * @param <T>
     */
    public static <T> Cancelable Post(String url,Map<String,Object> map,CommonCallback<T> callback){
        RequestParams params=new RequestParams(url);
        if(null!=map){
            for(Map.Entry<String, Object> entry : map.entrySet()){
                params.addParameter(entry.getKey(), entry.getValue());
            }
        }
        Cancelable cancelable = x.http().post(params, callback);
        return cancelable;
    }


    /**
     * 上傳文件
     * @param <T>
     */
    public static <T> Cancelable UpLoadFile(String url,Map<String,Object> map,CommonCallback<T> callback){
        RequestParams params=new RequestParams(url);
        if(null!=map){
            for(Map.Entry<String, Object> entry : map.entrySet()){
                params.addParameter(entry.getKey(), entry.getValue());
            }
        }
        params.setMultipart(true);
        Cancelable cancelable = x.http().post(params, callback);
        return cancelable;
    }

    /**
     * 下載文件
     * @param <T>
     */
    public static <T> Cancelable DownLoadFile(String url,String filepath,CommonCallback<T> callback){
        RequestParams params=new RequestParams(url);
        //設置斷點續傳
        params.setAutoResume(true);
        params.setSaveFilePath(filepath);
        Cancelable cancelable = x.http().get(params, callback);
        return cancelable;
    }
}
public class JsonResponseParser implements ResponseParser {
    //檢查server返回的響應頭信息
    @Override
    public void checkResponse(UriRequest request) throws Throwable {
    }

    /**
     * 轉換result為resultType類型的對象
     *
     * @param resultType  返回值類型(可能帶有泛型信息)
     * @param resultClass 返回值類型
     * @param result      字符串數據
     * @return
     * @throws Throwable
     */
    @Override
    public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable {
        return new Gson().fromJson(result, resultClass);
    }
}
public class MyCallBack<ResultType> implements Callback.CommonCallback<ResultType>{

    @Override
    public void onSuccess(ResultType result) {
        //能夠依據公司的需求進行統一的請求成功的邏輯處理
    }

    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
        //能夠依據公司的需求進行統一的請求網絡失敗的邏輯處理
    }

    @Override
    public void onCancelled(CancelledException cex) {

    }

    @Override
    public void onFinished() {

    }


}

1.發送get請求演示樣例:

//本get請求來自於免費測試接口:http://www.k780.com/api/entry.baidu
String url="http://api.k780.com:88/?

app=idcard.get"; Map<String,String> map=new HashMap<>(); map.put("appkey", "10003"); map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4"); map.put("format", "json"); map.put("idcard", "110101199001011114"); XUtil.Get(url, map, new MyCallBack<PersonInfoBean>(){ @Override public void onSuccess(PersonInfoBean result) { super.onSuccess(result); Log.e("result", result.toString()); } @Override public void onError(Throwable ex, boolean isOnCallback) { super.onError(ex, isOnCallback); } });

2.發送post請求

String url="http://api.k780.com:88/?app=idcard.get";
        Map<String,Object> map=new HashMap<>();
        map.put("appkey", "10003");
        map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
        map.put("format", "json");
        map.put("idcard", "110101199001011114");
        XUtil.Post(url, map, new MyCallBack<PersonInfoBean>(){

            @Override
            public void onSuccess(PersonInfoBean result) {
                super.onSuccess(result);
                Log.e("result", result.toString());
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);

            }
        });

3.上傳文件

/**
     * 上傳文件(支持多文件上傳)
     */
    private void uploadfile() {
        //圖片上傳地址
        String url="";
        Map<String,Object> map=new HashMap<>();
        //傳入自己的對應參數
        //map.put(key, value);
        //map.put(key, value);
        XUtil.UpLoadFile(url, map, new MyCallBack<String>(){

            @Override
            public void onSuccess(String result) {
                super.onSuccess(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);
            }

        });

    }

4.下載文件

private void downloadfile() {
        //文件下載地址
        String url="";
        //文件保存在本地的路徑
        String filepath="";
        XUtil.DownLoadFile(url, filepath,new MyCallBack<File>(){
            @Override
            public void onSuccess(File result) {
                super.onSuccess(result);

            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);

            }
        });

5.下載文件帶進度條

private void downloadprogressfile() {
        //文件下載地址
        String url="";
        //文件保存在本地的路徑
        String filepath="";
        XUtil.DownLoadFile(url, filepath,new MyProgressCallBack<File>(){

            @Override
            public void onSuccess(File result) {
                super.onSuccess(result);

            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);

            }
            @Override
            public void onLoading(long total, long current,
                    boolean isDownloading) {
                super.onLoading(total, current, isDownloading);

            }
        });
    }

6.發送get請求(server以xml格式返回)

private void getxml() {
        String url="http://flash.weather.com.cn/wmaps/xml/china.xml";
        XUtil.Get(url, null, new MyCallBack<String>(){

            @Override
            public void onSuccess(String xmlString) {
                super.onSuccess(xmlString);
                try{
                    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
                    XmlPullParser xmlPullParser = factory.newPullParser();  
                    xmlPullParser.setInput(new StringReader(xmlString));  
                    int eventType = xmlPullParser.getEventType();  
                    while (eventType != XmlPullParser.END_DOCUMENT) {  
                        switch (eventType) {  
                        case XmlPullParser.START_TAG:  
                            String nodeName = xmlPullParser.getName();  
                            if ("city".equals(nodeName)) {  
                                String pName = xmlPullParser.getAttributeValue(0);  
                                Log.e("TAG", "city is " + pName);  
                            }  
                            break;  
                        }  
                        eventType = xmlPullParser.next();  
                    }  
                }catch(Exception e){
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                super.onError(ex, isOnCallback);
            }

        });
    }

圖片載入模塊

使用方法:

x.image().bind(imageView, url, imageOptions);
x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
x.image().bind(imageView, "assets://test.gif", imageOptions);
x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...});

Xutils3的api還是比較簡單的,相信大家都能夠看懂。第一個參數傳入一個View。第二個參數傳入一個圖片的網絡地址,第三個參數通常是載入圖片的配置。
以下看一下ImageOptions這個類吧:

ImageOptions options=new ImageOptions.Builder()
//設置載入過程中的圖片
.setLoadingDrawableId(R.drawable.ic_launcher)
//設置載入失敗後的圖片
.setFailureDrawableId(R.drawable.ic_launcher)
//設置使用緩存
.setUseMemCache(true)
//設置顯示圓形圖片
.setCircular(true)
//設置支持gif
.setIgnoreGif(false)
.build();

其余的一些配置請參考源代碼

假設須要對載入的圖片進行操作的話,能夠使用:

x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});

通過返回的Drawable對象進行圖片的處理,滿足項目的個性化的要求.

說了這麽多,我想大家至少會對XUtils3有了一個主要的了解,因為XUtils3的數據庫的使用方法比較多,本篇文章不會去涉及,下一篇文章我會為大家具體解說XUtils3的數據庫模塊。大家趕緊如今動手操作一下吧!本文涉及到的全部實例都會在以下的demo中有涉及到。請自行參考。

XUtils3.zip

XUtils3框架的基本用法(一)