Handler使用总结

来源:互联网 发布:古天乐演技 知乎 编辑:程序博客网 时间:2024/06/15 17:23

大家都知道,在UI线程里是给你进行耗时操作的,但是我们要更新UI怎么办,所以一对好基友就出现了,Handler+thread.放代码了.

public class MainActivity extends AppCompatActivity {    private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //这里可以使用postDelayed方法,不过它只是单纯执行runnable里的run方法,所以还是在主线程中.不过它有定时功能.        /*handler.postDelayed(new Runnable() {            @Override            public void run() {            }        }, 1000*10);*/        textView = (TextView) findViewById(R.id.textView2);    }    public void downloadClick(View view){        new Thread(new Runnable() {            @Override            public void run() {                while(true){                    try {                        Thread.sleep(3000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }).start();        handler.sendEmptyMessage(100);        Message msg = handler.obtainMessage();        msg.what = 100;        //msg.obj = R.color.colorAccent;//everything        handler.sendMessage(msg);        handler.sendEmptyMessageAtTime(200, System.currentTimeMillis()+3000);//time        handler.sendEmptyMessageDelayed(300, 2000);//delayed    }    //定义一个内部类的时候,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义为一个静态内部类    private MyHandler handler = new MyHandler(this);    private static class MyHandler extends Handler{        WeakReference<MainActivity> weakReference;//使用弱引用,避免内存泄漏        public MyHandler(MainActivity activity){            weakReference = new WeakReference<MainActivity>(activity);        }        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            MainActivity activity = weakReference.get();            if(activity != null){                switch (msg.what){                    case 100:                        activity.textView.setText("yes!");                        Toast.makeText(activity, "dfs", Toast.LENGTH_SHORT).show();                        break;                    case 200:                        activity.textView.setText("yes!");                        Toast.makeText(activity, "gdf", Toast.LENGTH_SHORT).show();                        break;                    case 300:                        activity.textView.setText("yes!");                        Toast.makeText(activity, "dgd", Toast.LENGTH_SHORT).show();                        break;                    default:                        break;                }            }        }    }}注:一般如果你有很多线程要返回一系列值的话,最好将handler单独封装成一个类,作为任务分发者,协调处理所有耗时操作.
原创粉丝点击