积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
Android-线程更新UI的几个方式
error997 (error997)    2015-05-10 19:11:14      目标    课题
   如图,Android上新开的线程如想更新UI,需要重新跳到主线程中才能操作,以下是老外给出的几种方案,大家多多学习下.
   1通过UI控件post一个runnable子类:

切换到: 纯代码  
   
private void loadIcon() {  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                try {  
                    Thread.sleep(mDelay);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
  
                mBitmap = BitmapFactory.decodeResource(getResources(),  
                        R.drawable.painter);  
                mImageView.post(new Runnable() {  
                    @Override  
                    public void run() {  
  
                        mImageView.setImageBitmap(mBitmap);  
                    }  
                });  
            }  
        }).start();  
    }


   private void loadIcon() {
      new Thread(new Runnable() {
         @Override
         public void run() {
            try {
               Thread.sleep(mDelay);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }

            mBitmap = BitmapFactory.decodeResource(getResources(),
                  R.drawable.painter);
            mImageView.post(new Runnable() {
               @Override
               public void run() {

                  mImageView.setImageBitmap(mBitmap);
               }
            });
         }
      }).start();
   }

切换到: 纯代码  
   
new Thread(new Runnable() {  
            @Override  
            public void run() {  
                try {  
                    Thread.sleep(mDelay);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
  
                mBitmap = BitmapFactory.decodeResource(getResources(),  
                        R.drawable.painter);  
                SimpleThreadingExample.this.runOnUiThread(new Runnable() {  
                    @Override  
                    public void run() {  
                        mImageView.setImageBitmap(mBitmap);  
                    }  
                });  
            }  
        }).start();


   new Thread(new Runnable() {
         @Override
         public void run() {
            try {
               Thread.sleep(mDelay);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }

            mBitmap = BitmapFactory.decodeResource(getResources(),
                  R.drawable.painter);
            SimpleThreadingExample.this.runOnUiThread(new Runnable() {
               @Override
               public void run() {
                  mImageView.setImageBitmap(mBitmap);
               }
            });
         }
      }).start();

切换到: 纯代码  
   
private class LoadIconTask implements Runnable {  
        int resId;  
  
        LoadIconTask(int resId) {  
            this.resId = resId;  
        }  
  
        public void run() {  
  
            handler.post(new Runnable() {  
                @Override  
                public void run() {  
                    mProgressBar.setVisibility(ProgressBar.VISIBLE);  
                }  
            });  
  
            mBitmap = BitmapFactory.decodeResource(getResources(), resId);  
              
            // Simulating long-running operation   
              
            for (int i = 1; i < 11; i++) {  
                sleep();  
                final int step = i;  
                handler.post(new Runnable() {  
                    @Override  
                    public void run() {  
                        mProgressBar.setProgress(step * 10);  
                    }  
                });  
            }  
  
            handler.post(new Runnable() {  
                @Override  
                public void run() {  
                    mImageView.setImageBitmap(mBitmap);  
                }  
            });  
              
            handler.post(new Runnable() {  
                @Override  
                public void run() {  
                    mProgressBar.setVisibility(ProgressBar.INVISIBLE);  
                }  
            });  
        }  
    }


   private class LoadIconTask implements Runnable {
      int resId;

      LoadIconTask(int resId) {
         this.resId = resId;
      }

      public void run() {

         handler.post(new Runnable() {
            @Override
            public void run() {
               mProgressBar.setVisibility(ProgressBar.VISIBLE);
            }
         });

         mBitmap = BitmapFactory.decodeResource(getResources(), resId);
         
         // Simulating long-running operation
         
         for (int i = 1; i < 11; i++) {
            sleep();
            final int step = i;
            handler.post(new Runnable() {
               @Override
               public void run() {
                  mProgressBar.setProgress(step * 10);
               }
            });
         }

         handler.post(new Runnable() {
            @Override
            public void run() {
               mImageView.setImageBitmap(mBitmap);
            }
         });
         
         handler.post(new Runnable() {
            @Override
            public void run() {
               mProgressBar.setVisibility(ProgressBar.INVISIBLE);
            }
         });
      }
   }

切换到: 纯代码  
   
static class UIHandler extends Handler {  
        WeakReference<HandlerMessagesActivity> mParent;  
  
        public UIHandler(WeakReference<HandlerMessagesActivity> parent) {  
            mParent = parent;  
        }  
  
        @Override  
        public void handleMessage(Message msg) {  
            HandlerMessagesActivity parent = mParent.get();  
            if (null != parent) {  
                switch (msg.what) {  
                case SET_PROGRESS_BAR_VISIBILITY: {  
                    parent.getProgressBar().setVisibility((Integer) msg.obj);  
                    break;  
                }  
                case PROGRESS_UPDATE: {  
                    parent.getProgressBar().setProgress((Integer) msg.obj);  
                    break;  
                }  
                case SET_BITMAP: {  
                    parent.getImageView().setImageBitmap((Bitmap) msg.obj);  
                    break;  
                }  
                }  
            }  
        }  
  
    }  
  
    Handler handler = new UIHandler(new WeakReference<HandlerMessagesActivity>(  
            this));  
  
  
private class LoadIconTask implements Runnable {  
        private final int resId;  
        private final Handler handler;  
  
        LoadIconTask(int resId, Handler handler) {  
            this.resId = resId;  
            this.handler = handler;  
        }  
  
        public void run() {  
  
            Message msg = handler.obtainMessage(SET_PROGRESS_BAR_VISIBILITY,  
                    ProgressBar.VISIBLE);  
            handler.sendMessage(msg);  
  
            final Bitmap tmp = BitmapFactory.decodeResource(getResources(),  
                    resId);  
  
            for (int i = 1; i < 11; i++) {  
                sleep();  
                msg = handler.obtainMessage(PROGRESS_UPDATE, i * 10);  
                handler.sendMessage(msg);  
            }  
  
            msg = handler.obtainMessage(SET_BITMAP, tmp);  
            handler.sendMessage(msg);  
  
            msg = handler.obtainMessage(SET_PROGRESS_BAR_VISIBILITY,  
                    ProgressBar.INVISIBLE);  
            handler.sendMessage(msg);  
        }  
  
        private void sleep() {  
            try {  
                Thread.sleep(mDelay);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }


   static class UIHandler extends Handler {
      WeakReference<HandlerMessagesActivity> mParent;

      public UIHandler(WeakReference<HandlerMessagesActivity> parent) {
         mParent = parent;
      }

      @Override
      public void handleMessage(Message msg) {
         HandlerMessagesActivity parent = mParent.get();
         if (null != parent) {
            switch (msg.what) {
            case SET_PROGRESS_BAR_VISIBILITY: {
               parent.getProgressBar().setVisibility((Integer) msg.obj);
               break;
            }
            case PROGRESS_UPDATE: {
               parent.getProgressBar().setProgress((Integer) msg.obj);
               break;
            }
            case SET_BITMAP: {
               parent.getImageView().setImageBitmap((Bitmap) msg.obj);
               break;
            }
            }
         }
      }

   }

   Handler handler = new UIHandler(new WeakReference<HandlerMessagesActivity>(
         this));


private class LoadIconTask implements Runnable {
      private final int resId;
      private final Handler handler;

      LoadIconTask(int resId, Handler handler) {
         this.resId = resId;
         this.handler = handler;
      }

      public void run() {

         Message msg = handler.obtainMessage(SET_PROGRESS_BAR_VISIBILITY,
               ProgressBar.VISIBLE);
         handler.sendMessage(msg);

         final Bitmap tmp = BitmapFactory.decodeResource(getResources(),
               resId);

         for (int i = 1; i < 11; i++) {
            sleep();
            msg = handler.obtainMessage(PROGRESS_UPDATE, i * 10);
            handler.sendMessage(msg);
         }

         msg = handler.obtainMessage(SET_BITMAP, tmp);
         handler.sendMessage(msg);

         msg = handler.obtainMessage(SET_PROGRESS_BAR_VISIBILITY,
               ProgressBar.INVISIBLE);
         handler.sendMessage(msg);
      }

      private void sleep() {
         try {
            Thread.sleep(mDelay);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }

切换到: 纯代码  
   
class LoadIconTask extends AsyncTask<Integer, Integer, Bitmap> {  
  
  
    @Override  
    protected void onPreExecute() {  
        mProgressBar.setVisibility(ProgressBar.VISIBLE);  
    }  
  
    @Override  
    protected Bitmap doInBackground(Integer... resId) {  
        Bitmap tmp = BitmapFactory.decodeResource(getResources(), resId[0]);  
        // simulating long-running operation    
        for (int i = 1; i < 11; i++) {  
            sleep();  
            publishProgress(i * 10);  
        }  
        return tmp;  
    }  
  
    @Override  
    protected void onProgressUpdate(Integer... values) {  
        mProgressBar.setProgress(values[0]);  
    }  
  
    @Override  
    protected void onPostExecute(Bitmap result) {  
        mProgressBar.setVisibility(ProgressBar.INVISIBLE);  
        mImageView.setImageBitmap(result);  
    }  
  
    private void sleep() {  
        try {  
            Thread.sleep(mDelay);  
        } catch (InterruptedException e) {  
            Log.e(TAG, e.toString());  
        }  
    }  
}


   class LoadIconTask extends AsyncTask<Integer, Integer, Bitmap> {


      @Override
      protected void onPreExecute() {
         mProgressBar.setVisibility(ProgressBar.VISIBLE);
      }

      @Override
      protected Bitmap doInBackground(Integer... resId) {
         Bitmap tmp = BitmapFactory.decodeResource(getResources(), resId[0]);
         // simulating long-running operation 
         for (int i = 1; i < 11; i++) {
            sleep();
            publishProgress(i * 10);
         }
         return tmp;
      }

      @Override
      protected void onProgressUpdate(Integer... values) {
         mProgressBar.setProgress(values[0]);
      }

      @Override
      protected void onPostExecute(Bitmap result) {
         mProgressBar.setVisibility(ProgressBar.INVISIBLE);
         mImageView.setImageBitmap(result);
      }

      private void sleep() {
         try {
            Thread.sleep(mDelay);
         } catch (InterruptedException e) {
            Log.e(TAG, e.toString());
         }
      }
   }

转自 http://blog.csdn.net/qq285016127/article/details/39030567
(+0)技能Get

建议楼主:搜索关键字 |参考其他资源 |回复 |追问
  error997(error997):   个人中心    课题    目标    代码积累