Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 安卓高級 -----Xutil3 和Picasso使用

安卓高級 -----Xutil3 和Picasso使用

編輯:關於Android編程

Xutils3

Xutils由於內部使用httpclient然而在安卓5.0谷歌發現httpclient出現不穩定的情況.於6.0完全棄用,所以作者升級到Xutils3替換原本網絡模塊

配置環境(Studio):
在build.gradle添加依賴

dependencies {
 compile 'org.xutils:xutils:3.3.36'
}

以下就Xutils3的四個模塊分別給出案例:

View模塊:

簡化開發者 寫findViewId和設置布局等冗余代碼等

在activity使用案例
package qianfeng.com.day36_xutils;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;


/*
xUtils3  的View 框架
目的: 減少代碼量

使用方式:
    1.在onCreate方法中 初始化 View模塊
        x.view().inject();
    2.不需要添加findViewById方法
        在引用上面添加  @ViewInject(ViewId) 即可使用
    3.可以省略 setContentView方法
        需要在 Activity 上  添加
        @ContentView(LayoutId)
    4.點擊事件注解
        創建方法    必須是 私有
        private void onClick(View view){}
        在該方法上面添加
        @Event(ViewId)
        @Event({ViewId數組})
        @Even( value = ViewId)
        @Even(value = {ViewID數組})
        不需要在 xml文件中添加 onClick 屬性
    5.注意!
        在使用過程中  必須先執行  x.view().inject 方法
        在使用過程中   不允許出現重復Id 養成習慣
 */
@ContentView(R.layout.activity_view)
public class ViewActivity extends AppCompatActivity {

    @ViewInject(R.id.view_tv)
    private TextView tv;

    @ViewInject(R.id.view_bt)
    private Button view_bt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        View View = LayoutInflater.from(this).inflate(R.layout.activity_view, null);
//        setContentView(View);
        x.view().inject(this);

        tv.setText("今天天氣 好晴朗~");
    }


    //  點擊事件 
    @Event(value = {R.id.view_bt, R.id.view_tv})
    private void onClick(View view) {
        switch (view.getId()) {
            case R.id.view_bt:
                Toast.makeText(ViewActivity.this, "大家注意防霧霾", Toast.LENGTH_SHORT).show();
                break;
            case R.id.view_tv:
                Toast.makeText(ViewActivity.this, "騙誰呢,霧霾天", Toast.LENGTH_SHORT).show();
                break;
        }
    }


}
對應布局文件




    
Fragment 使用案例 先寫個基礎BaseFragment讓子類繼承
BaseFragment (無對應界面)
package qianfeng.com.day36_xutils.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import org.xutils.x;

/**
 *Fragment  中 使用注解
 * 1.在onCreateView 方法中
 *  return  x.view().inject(this,inflater,container)
 * 2.定義標記
 *          isInject  記錄是否有 被初始化過
 * 3.在 onCreateView 方法 中將 變量標記為  true
 * 4.在 onViewCreated 方法中 判斷   是否被  初始化過
 *      如果沒有
 *      則
 *      x.view().inject(this,getView())即可
 * 5.封裝BaseFragment  繼承後  可 省略  onCreateView 方法的重寫
 * 6.需要在 類的上方添加 @ContentView(FragmentLayoutId)

 */
public class BaseFragment extends Fragment {

    private  boolean  isInject =  false;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        isInject = true;
//        View view = inflater.inflate(R.layout.fragment_base, container, false);
        return x.view().inject(this,inflater,container);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (!isInject){
            x.view().inject(this,getView());
        }
    }
}

子類fragment:

package qianfeng.com.day36_xutils.fragment;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;

import qianfeng.com.day36_xutils.R;

@ContentView(R.layout.fragment_view)
public class ViewFragment extends BaseFragment {

    @ViewInject(R.id.fragemnt_tv)
    TextView fragment_tv;

    @Event(R.id.fragemnt_tv)
    private void onClick(View view) {
        Toast.makeText(getActivity(), "彈彈彈", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        fragment_tv.setText("實例化數據");
    }
}
子類對應布局
<framelayout android:layout_height="match_parent" android:layout_width="match_parent" tools:context="qianfeng.com.day36_xutils.fragment.ViewFragment" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">

    
    

</framelayout>
在適配器中使用
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_layout, parent, false);
            holder = new ViewHolder();
            // 初始化View
            x.view().inject(holder, convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.item_name_tv.setText(list.get(position).getName());
        holder.item_age_tv.setText(list.get(position).getAge());
        holder.item_sex_tv.setText(list.get(position).getSex());

        return convertView;
    }

    static class ViewHolder {

        @ViewInject(R.id.item_name_tv)
        TextView item_name_tv;
        @ViewInject(R.id.item_age_tv)
        TextView item_age_tv;
        @ViewInject(R.id.item_sex_tv)
        TextView item_sex_tv;
    }

Imga 模塊

注意初始化:初始化一般application中如下

package com.example.app;

import android.app.Application;

import org.xutils.x;

/**
 * Created by Administrator on 2016/10/17.
 */

public class Myapplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(true);//打開日志信息 不屬於初始化 發布時可以刪除 影響性能
    }
}
package qianfeng.com.day36_xutils;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

import org.xutils.image.ImageOptions;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;

import java.io.File;

@ContentView(R.layout.activity_image)
public class ImageActivity extends AppCompatActivity {

    @ViewInject(R.id.show_iv)
    private ImageView show_iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_image);
            x.view().inject(this);
        //  通過  這個 管理者加載  Assets 文件中的 資源
//        AssetManager
    }

    @Event({R.id.file_bt, R.id.sd_bt, R.id.http_bt})
    private void onClick(View view) {
        switch (view.getId()) {
            case R.id.file_bt:
                //  圖片 處理參數配置
                ImageOptions.Builder builder = new ImageOptions.Builder();
                builder.setIgnoreGif(false);// 設置 不要忽略 Gif圖片    默認是 true  不支持
                builder.setLoadingDrawableId(R.mipmap.ic_launcher); // 加載的時候顯示的圖片
                builder.setFailureDrawableId(R.mipmap.ic_launcher);//  加載失敗的時候顯示的圖片
                x.image().bind(show_iv, "assets://cat.gif", builder.build());
                break;
            case R.id.sd_bt:
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "qq.png";

                    TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 200);
                    animation.setDuration(10000);

                    ImageOptions options = new ImageOptions.Builder()
                            .setUseMemCache(true)//使用緩存 默認為ture 如果為false每次都會從文件中讀取 動畫也會執行多次 為ture只會執行一次動畫
                            //    .setCircular(true)//使這個圖片變成個圓
                            .setRadius(20)// 設置圓角角度
                            .setCrop(true)// 設置是否填充大小 如果圖片是100 *100 現在設置200,200 如果此選項為false那麼保持原圖大小
//                            .setSize(200,200)
                            .setAnimation(animation) // 添加加載後執行的 動畫
                            .setAutoRotate(true)// 自動旋轉
                            .setConfig(Bitmap.Config.RGB_565)// 每個像素的 格式
                            .build();

                    //必須初始化 x.Ext.init(getApplication()); 此案例已經寫在application類中
                    x.image().bind(show_iv, path, options);
                }

                break;
            case R.id.http_bt:
                x.image().bind(show_iv, "http://img5.duitang.com/uploads/item/201510/01/20151001014728_tmHdG.jpeg");
                break;
        }
    }

}

數據庫模塊(ROM):

package com.example.app;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import org.xutils.DbManager;
import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;
import org.xutils.db.sqlite.WhereBuilder;
import org.xutils.ex.DbException;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;

import java.util.ArrayList;
import java.util.List;


@ContentView(R.layout.activity_db)
public class DBActivity extends AppCompatActivity {

    @ViewInject(R.id.lv)
    ListView lv;
    private DbManager db;
    private ArrayAdapter adapter;
    private List dataText;
    /**
     * 數據庫建表
     * 1.在類名上面寫上@Table(name = "TableName")
     * 2.在屬性上面添加 @Colum(name = "columName" )
     *     isId   是否是主鍵
     *     autoGen  自增長   默認 true
     * 3.構造方法必須全寫有參構造以及 無參構造
     *
     *
     *
     *
     * Created by ${Mr.Zhao} on 2016/10/17.
     */
    //自動創建對應的表
    @Table(name="Student")
    static  class Student{
        //name = xxx 誰知對應在數據庫的字段名
        // isId 是否為主鍵
        //autoGen 是否自增長
        //如果使用自增長 添加時想讓id自動雖數據庫變化應使用此Api db.saveBindingId(s); 不然id為bean 對象id
        @Column(name = "id",isId = true,autoGen = true)
        int id;
        @Column(name="name")
        String name;

        public Student(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public Student() {
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);

      DbManager.DaoConfig config = new DbManager.DaoConfig();
        config.setDbName("info.db");
        config.setDbVersion(1);
                //設置數據庫的位置 不設置為默認數據庫位置data/data/pagekage/database/XXX.DB
//        config.setDbDir();
        dataText = new ArrayList<>();


        db = x.getDb(config);
        for (int i = 20; i < 40; i++) {
            Student  s= new Student(i,"asd"+i);

            try {
                db.saveBindingId(s);
            } catch (DbException e) {
                e.printStackTrace();
            }
        }

        adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,dataText);
        lv.setAdapter(adapter);
    }

    @Event({R.id.cx,R.id.del, R.id.update})
    private  void test(View v) throws DbException {
        switch (v.getId()) {
            case R.id.cx:
                List all = db.findAll(Student.class);
                dataText.clear();
                for (int i = 0; i < all.size(); i++) {
                    dataText.add(all.get(i).name);
                }
                adapter.notifyDataSetChanged();
                break;
            case R.id.del:
                WhereBuilder builder =  WhereBuilder.b("name","=","asd20");
                int delete = db.delete(Student.class, builder);
                Toast.makeText(this, ""+delete, Toast.LENGTH_SHORT).show();
                break;
            case  R.id.update:
                db.saveOrUpdate(new Student(13,"ヾ(ToT)Bye~Bye~一"));
                break;
            default:
        }
    }
}

http模塊
package qianfeng.com.day36_xutils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import org.xutils.common.Callback;
import org.xutils.http.HttpMethod;
import org.xutils.http.RequestParams;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;

import java.io.File;

public class HttpActivity extends AppCompatActivity {
    @ViewInject(R.id.http_show_iv)
    private ImageView http_show_iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_http);
        x.view().inject(this);
    }

    @Event({R.id.http_get_bt, R.id.http_post_bt, R.id.http_request_bt, R.id.http_down_bt})
    private void onClick(View view) {
        switch (view.getId()) {
            case R.id.http_get_bt:
                // 通過 get方式獲取數據
                getNetData();
                break;
            case R.id.http_post_bt:
                // post方式
                postNetData();
                break;
            case R.id.http_request_bt:
                //  請求
                requestNetData();
                break;
            case R.id.http_down_bt:
                //下載
                downNetData();

                break;
        }

    }

    // 下載
    private void downNetData() {
        //  獲取文件下載的  地址
        final String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "pic.jpg";
        RequestParams params = new RequestParams("http://tupian.enterdesk.com/2013/mxy/10/14/1/7.jpg");
        //  設置 文件下載後的保存路徑
        params.setSaveFilePath(file_path);
        //   文件下載設置的進度監聽器
        x.http().get(params, new Callback.ProgressCallback() {
            @Override
            public void onWaiting() {

            }

            @Override
            public void onStarted() {

            }

            @Override
            public void onLoading(long total, long current, boolean isDownloading) {
                // 文件下載的進度
                int l = (int) (current * 100 / total);
                Log.d("Mr.Zhao", "onLoading: " + l);
            }

            @Override
            public void onSuccess(File result) {
                // 文件下載成功後的結果
                Bitmap bitmap = BitmapFactory.decodeFile(file_path);
                if (bitmap != null)
                    http_show_iv.setImageBitmap(bitmap);

            }

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

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }

    private void requestNetData() {
        //  直接請求 網絡數據  配置請求方法   HttpMehod    GET  POST  常量
        x.http().request(HttpMethod.GET, new RequestParams("http://218.244.149.129:9010/api/industry.php"), new Callback.CommonCallback() {
            @Override
            public void onSuccess(String result) {

            }

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

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }

    // 以post方式請求
    private void postNetData() {
        RequestParams params = new RequestParams("http://218.244.149.129:9010/api/companylist.php");
        params.addBodyParameter("industryid", "100");
        x.http().post(params, new Callback.CommonCallback() {
            @Override
            public void onSuccess(String result) {
                Log.d("Mr.Zhao", "onSuccess: " + result);
            }

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

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });

    }

    // 以get方式 請求網絡數據
    private void getNetData() {
        String path = "http://218.244.149.129:9010/api/industry.php";
        RequestParams params = new RequestParams(path);
        Callback.Cancelable cancelable = x.http().get(params, new Callback.CommonCallback() {
            @Override
            public void onSuccess(String result) {
                // 獲取成功的時候執行該方法  並返回數據
                Log.d("Mr.Zhao", "onSuccess: " + result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                // 拋出異常的時候執行該方法
                Log.d("Mr.Zhao", "onError: ");
            }

            @Override
            public void onCancelled(CancelledException cex) {
                // 當 調用了 取消方法的時候 執行該方法
                Log.d("Mr.Zhao", "onCancelled: ");
            }

            @Override
            public void onFinished() {
                // 執行結束的時候執行該方法
                //  包含成功後
                Log.d("Mr.Zhao", "onFinished: ");
            }
        });
        // 通過get方法  返回值 進行 取消訪問網絡的 操作
        // cancelable.cancel();


    }


}

Picasso

初始化 當然也可以不用 我們在application中

package qianfeng.com.picassodemo.app;

import android.app.Application;
import android.graphics.Bitmap;

import com.squareup.picasso.LruCache;
import com.squareup.picasso.Picasso;

/**
 * Created by ${Mr.Zhao} on 2016/10/17.
 */
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        initPicasso();
    }

    private void initPicasso() {
        int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
        Picasso picasso = new Picasso.Builder(this)
                .memoryCache(new LruCache(maxSize))//設置內存緩存
                /*默認false
                true   會在 ImageView 的 左上角 添加一個 三角形的 符號
                  紅色  網絡   第一次下載
                  綠色  內存    銷毀Activity再次進入
                  藍色  SD      清空了任務列表
                 */
                .indicatorsEnabled(true)
//                .downloader()  修改下載器
                .defaultBitmapConfig(Bitmap.Config.RGB_565)
                .build();

        // 設置當前的 Picasso對象為 單例模式
        Picasso.setSingletonInstance(picasso);
    }
}
package qianfeng.com.picassodemo;

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;

public class MainActivity extends AppCompatActivity {


    private String path = "http://img5.duitang.com/uploads/item/201510/01/20151001014728_tmHdG.jpeg";
    private ImageView show_iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show_iv = (ImageView) findViewById(R.id.show_iv);
        Picasso.with(this).load(path)
                .config(Bitmap.Config.RGB_565)
//                .resize(50, 50)  // 重新定義大小
//                .centerCrop()//執行裁剪
                .error(R.mipmap.ic_launcher)// 錯誤的時候 顯示的圖片   請求網絡 三次 失敗
                .placeholder(R.mipmap.ic_launcher)// 默認圖片
                .into(show_iv);


    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved