handler与异步任务

不知道为什么,刚才写的安卓下的事件监听会待审核,好吧,只是为了记录下我的学习状态而已
接下来说说安卓下的线程安全的问题
安卓的主线程是不允许用户将耗时的事情放在主线程中进行处理的,因为这样容易造成线程的不安全
线程安全:在java中,线程的安全就是指,例如有两个线程同时在操作同一个ArrayList的时候,我们都
知道,在add方法的时候,分两步,第一步是增加数据,第二步是增加元素的个数,那么问题就来了,
如果现在是两个线程,第一个线程实现了第一步,然后线程暂时停止,而第二个线程获得CPU的执行权,
那么添加数据,然后两个线程同时复活,然后元素只是增加了一个,这样就会造成数据的丢失的问题。
那么在安卓中,为了避免主线程被阻塞,其实在主线程如果出现阻塞的话,会有ANR错误,ANR
如果主线程收到阻塞,那么程序会蹦出一个窗口,通知用户,是否将程序关闭这样的问题。
首先利用handler这一个对象,可以在新开启的子线程中发送数据给主线程,然后通过handler指挥主线程做
什么事情,这样就不会造成线程不安全,比如我们可以传what,然后再handler.hanldeMessage(Message msg)的方法中
判断what值,然后执行相应的操作。
异步任务有两个需要注意,第一个是实现doInBackground方法,第二是onPostExecute,前面的是任务的执行,第二是任务
的返回值的处理。

 class MyTask extends AsyncTask<String,Void,String>
     {
         //异步任务进行
        protected String doInBackground(String... args) {
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            String line=null;
            StringBuilder sb=new StringBuilder();
            try {
                while((line=br.readLine())!=null){
                    sb.append(line);
                }
                return sb.toString();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        //获取返回值进行的操作
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            editText_1.setText(result);
        }
    }
private  class MyClickListener implements OnClickListener
        {
            public void onClick(View v)
            {
                new MyTask().execute();
                Toast.makeText(MainActivity.this,"按钮被点击",Toast.LENGTH_SHORT).show();
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章