zoukankan      html  css  js  c++  java
  • 安卓高级1 -----Xutil3 和Picasso使用

    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;
              }
          }
      
      
      }
      
      • 对应布局文件
      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:paddingBottom="@dimen/activity_vertical_margin"
          android:paddingLeft="@dimen/activity_horizontal_margin"
          android:paddingRight="@dimen/activity_horizontal_margin"
          android:paddingTop="@dimen/activity_vertical_margin"
          tools:context=".ViewActivity">
      
      
          <TextView
              android:id="@+id/view_tv"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="处处好风光"
              android:textSize="20sp" />
      
          <Button
              android:id="@+id/view_bt"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentRight="true"
              android:text="Button" />
      
          <fragment
              android:id="@+id/view_fragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              class="qianfeng.com.day36_xutils.fragment.ViewFragment"
              android:layout_below="@id/view_bt" />
      </RelativeLayout>
      
    • 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 xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="qianfeng.com.day36_xutils.fragment.ViewFragment">
    
        <!-- TODO: Update blank fragment layout -->
        <TextView
            android:id="@+id/fragemnt_tv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/hello_blank_fragment" />
    
    </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<String> adapter;
        private List<String> 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<String>(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<Student> 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<File>() {
                @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<String>() {
                @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<String>() {
                @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<String>() {
                @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);
    
    
        }
    }
    
  • 相关阅读:
    angular.element函数
    mknod创建命名管道(I/O缓存)
    谈谈sipXecs及其它【转】
    Linux下判断cpu物理个数、几核
    shell 中判断文件/文件夹是否存在
    一个人可以用Open IMS Core做什么呢
    linux 下更改磁盘名
    PPTP 服务器配置
    IP多媒体子系统[转维基百科]
    针对用编译的方式安装时的卸载
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152146.html
Copyright © 2011-2022 走看看