Android读书笔记(七) Gson、AsyncTask、Service与Activity通信

1.Gson的使用

  添加Gson,在app/build.gradle中的dependencies 下加入如下信息:

dependencies {
    compile 'com.google.code.gson:gson:2.7'
}

  Gson相对于JSONObject来说,要方便的多。比如:可以将JSON格式的字符串转换成对象或将对象直接转换成JSON格式的字符串等等。

                //对象转json
                Student student = new Student(1, "张三", "女");
                Gson gson = new Gson();
                String s = gson.toJson(student, Student.class);
                Log.i("123123", s);

                //json转对象
                Student student1 = gson.fromJson(s, Student.class);
                Log.i("123123", student1.toString());

                //list转Json数组
                Student student4 = new Student(1, "张三", "女");
                Student student5 = new Student(2, "张三", "女");
                Student student6 = new Student(3, "张三", "女");
                List list = new ArrayList<Student>();
                list.add(student4);
                list.add(student5);
                list.add(student6);
                String str = gson.toJson(list
                            , new TypeToken<List<Student>>() {}.getType());
                Log.i("123123", str);

                //json数组转list
                List<Student> students = gson.fromJson(str
                            , new TypeToken<List<Student>>() {}.getType());

                for(Student stu:students){

                    Log.i("123123",stu.toString());
                }

  输出内容

.../123123: {"gender":"女","id":1,"name":"张三"}
.../123123: Student{id=1, name='张三', gender='女'}
.../123123: [{"gender":"女","id":1,"name":"张三"},{"gender":"女","id":2,"name":"张三"},{"gender":"女","id":3,"name":"张三"}]
.../123123: Student{id=1, name='张三', gender='女'}
.../123123: Student{id=2, name='张三', gender='女'}
.../123123: Student{id=3, name='张三', gender='女'}

2.使用AsyncTask

   要使用AsyncTask需要指定3个泛型参数。

  • params 执行AsyncTask时需要的信息,对应doInBackground(params… )
  • Progress 需要在界面上显示当前的进度,指定泛型来作为进度单位,对应onProgressUpdate(Progress…)
  • Result 对结果进行返回,指定泛型来作为返回值类型,对应onPostExecute(Result…)
      下面展示个小程序,模拟下载过程,来说明一下AsyncTask的用法。
    /*这里自定义了一个AsyncTask
    *参数一:void,不需要传入信息
    *参数二:Integer,用来作为进度显示单位
    *参数三:Boolean,执行完成后的结果
    * */
public class ImitateTask extends AsyncTask<Void, Integer, Boolean> {

    private ProgressDialog progressDialog;
    private Context context;
    //模拟当前进度
    private int i = 0;

    public ImitateTask(ProgressDialog progressDialog, Context context) {

        this.context = context;
        this.progressDialog = progressDialog;
    }


    /**
     * 任务开始之前调用,进行界面的初始化
     */
    @Override
    protected void onPreExecute() {
        progressDialog.show();
    }

    /**
     * doInBackground()方法中的代码会运行在子线程中,如果要更新UI,需要调用publishProgress()。
     * 此方法主要处理耗时工作。
     */
    @Override
    protected Boolean doInBackground(Void... voids) {
        while (true) {
            int percent = download();
            publishProgress(percent);//会去调用onProgressUpdate()
            if (percent == 100) {
                break;
            }
        }
        return true;
    }

    //模拟下载功能
    private int download() {
        i++;
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return i;
    }

    /**
     * 任务执行完毕后,对返回的数据做相应的操作
     */
    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);

        progressDialog.dismiss();
        if (aBoolean) {
            Toast.makeText(context, "下载完毕", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 更新进度条
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

        progressDialog.setProgress(i);
    }

}
        pull_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ProgressDialog progressDialog = new ProgressDialog(ABCActivity.this);
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                ImitateTask imitateTask = new ImitateTask(progressDialog, ABCActivity.this);
                imitateTask.execute();
            }
        });


这里写图片描述

3.Service与Activity通信

  在Android Studio中创建Service是非常方便的,在要创建Service的包右键→New→Service→Service。

   活动和服务进行通信,需要靠Service中的onBind()。下面展示个小程序来说明怎么用。

public class MyService extends Service {

    ImitateBinder imitateBinder = new ImitateBinder();
    //创建内部类ImitateBinder并集成Binder,当Activity获取到ImitateBinder的实例就可以对其进行操作了。
    class ImitateBinder extends Binder {

        //充当下载
        public void startDownload() {
            Log.i("123123", "startDownload");
        }
        //充当下载进度
        public int getProgress() {
            Log.i("123123", "getProgress");
            return 1;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {

        return imitateBinder;
    }
}

   在Activity中创建ServiceConnection,用来获取ImitateBinder的实例,在获取实例之前还需要将服务与活动绑定。

        //绑定
       bind_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ABCActivity.this, MyService.class);
                bindService(intent, connection, BIND_AUTO_CREATE);
            }
        });
    //获取实例
    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            imitateBinder = (MyService.ImitateBinder) service;
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };

  对service进行操控。

        start_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                imitateBinder.startDownload();
            }
        });
        get_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                imitateBinder.getProgress();
            }
        });

  当service既调用了startService(),又调用bindService(),要使此服务销毁,要调用stopService()和unbindService()才能使得服务被销毁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值