假如  我后台线程  下载 或者  别的什么任务,   而UI线程  在不停的和 用户交互,
   请问下 UI线程 能喝后台线程通信么?
   如果能,如何和后台线程通信?
  

解决方案 »

  1.   

    线程跟线程间通信,由于是在同一个进程中,所以变量地址都是相同的,能直接访问
    也就是说,UI线程想执行A线程(某个class实现了runable)的函数fun,那么直接A的实例 a.fun()就行了
    不过要注意不能阻塞,否则就会出现force close的窗口,所以一般是丢到handler,handler是消息队列的一种实现
      

  2.   

    后台线程也是ui线程创建的,你直接在后台线程里给ui线程发handler消息,来处理主UI的更新。
    可以google参考 “异步任务 下载”
      

  3.   

       在写后台线程的时候,一般都是把run函数实现成一个循环体,这样后台线程才能在有需要的情况下退出。
        so,你只需要在循环体的开始处添加一个变量,然后,由UI线程来更改这个变量,后台线程就知道了。不过,这种写法,只适合UI线程关闭后台线程的情况。
        更加复杂的则是,让UI线程直接去访问后台线程的资源。访问是没问题的,但是要注意线程同步问题,当然1楼说的阻塞UI线程是不行的。遇到这个情况,就考虑在后台线程中建立Handler来处理。
      

  4.   

    后台线程和UI线程通信本质上是通过发送消息来实现的,实现的方式有最主要的两种Handler和AsyncTask
    这里有篇博客写的挺不错,你可以去看看http://www.cnblogs.com/playing/archive/2011/03/24/1993583.html
      

  5.   

    使用Handler
    比如:
       Handler mHandler = new Handler(){
    public void handleMessage(android.os.Message msg) {
              switch (msg.what) {
    case 1:
                    //do something pd = new ProgressDialog(HomeActivity.this);
    pd.setMessage(getString(R.string.start_app));
    pd.show();
    break; case 2:

    break;
    default:
    break;
    }
    }
    };在线程中:
      run(){
     mHandler.sendEmptyMessage(2);
      }
     
      

  6.   

    LZ是想实现下载进度的功能,这种功能在Android里最快捷好用的是使用AsyncTask类
    在doBackground里面做请求网络操作,将随时获取的进度通过public进行发送,将处理完的数据放到onPostexe里面进行处理。