GeekBand--第八周分享

来源:互联网 发布:vb手机版下载 编辑:程序博客网 时间:2024/05/16 08:33

代码的重构

代码的简洁清晰明了非常的重要!代码重构要注意以下几点

1.把一些独立的方法分离出来,重构成一个类,是代码简洁并且容易使用
2.把一些注释了的没有的代码都删除了
3.记住封装的特性!这样才能使程序更有扩展性!

多线程的概念

多线程能帮助我们提高效率,可以并行多个任务,就像多个流水线工作!

主线程就是UI线程

工作线程就是你new出来的一个线程

线程安全

就是当线程之间进行资源竞争的时候可能产生线程不安全事故!所以需要加锁!

用以下这些方法可以在异步线程中更新主线程的东西!

                 // Worker 线程              new Thread(new Runnable() {                    @Override               public void run() {            // 第一种             runOnUiThread(new Runnable() {                 @Override                 public void run() {                     mTextView.setText("我在其它线程中千辛万苦来看你……");                 }             });            // 第二种            mTextView.post(new Runnable() {                @Override                public void run() {                    mTextView.setText("我在其它线程中千辛万苦来看你……");                }            }) ;            // 第三种            mTextView.postDelayed(new Runnable() {                @Override                public void run() {                    mTextView.setText("我在其它线程中千辛万苦来看你……");                }            },1000);            // 第四种            new Handler(Looper.getMainLooper()).post(new Runnable() {                @Override                public void run() {                    mTextView.setText("我在其它线程中千辛万苦来看你……");                }            });        }    }).start();

也可以用AsynTaskL来处理

    class TestTask extends AsyncTask<Integer,Integer,String>{    @Override    protected void onPreExecute() {        // main thread ,before doInBackground();        mTextView.setText("加载中");        super.onPreExecute();    }    @Override    protected String doInBackground(Integer... params) {        // worker thread        // download parse xml data        return String.valueOf(params[0] * 2 + 2);    }    @Override    protected void onPostExecute(String result) {        super.onPostExecute(result);        // main thread ,after doInBackground();        mTextView.setText("加载完成, 结果是:" + result);    }}

new Thread()与ThreadPoolExecutor的对比

New Thread()的弊端

  • 每次new Thread的新建对象性能差
  • 线程缺乏统一的管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom
  • 缺乏更多功能,如定时执行、定期执行、线程中断。

ThreadPoolExecutor

  • 提升性能。创建和小号对象费时费CPU资源
  • 防止内存过度小号。控制活动线程的数量,防止并发线程过多

线程池

主要有以下线程池

1.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

也可以通过handler处理主线程与异步线程的交互

                   // update UI   在异步线程中发送消息             Message message = mHandler.obtainMessage();            message.obj = progress;            message.what = 0;            mHandler.sendMessage(message);              //主线程中处理          @Override         public void handleMessage(Message msg) {                super.handleMessage(msg);                MainActivity activity = mActivity.get();          switch (msg.what) {            case 0:            int progress = (int) msg.obj;            activity.getProgressBar().setProgress(progress);            activity.getTextView().setText("进度:" + progress + "%");            if(progress == 100){                Toast.makeText(activity, "download success",                    Toast.LENGTH_SHORT).show();            }            break;    }}
0 0
原创粉丝点击