注意asynctask是一个子类运行在ui线程中的,内部还是concurrent和handler、looper以及消息队列的处理,和thread加handler没本质区别,除非你架构太烂了

解决方案 »

  1.   

    代码太多了,几个类。这样说吧,我开了一个开台运行的子线程,然后在在Activity中触发事件用AsyncTask改变组件,(注:AsyncTask并不是在那个子线程里的,子线程里并不涉及任何UI有关的处理,或你可以理解为只是打印一样信息)
      

  2.   

    假设UI主线程为A,子线程为B,AsyncTask为C。楼主的意思是不是  A启动了B,然后B发消息给A,A再启动C?
      

  3.   

    是B没有发消息给A,你可以理解为B启动后只是调用System.out.println()而已,没其它操作
      

  4.   

    如果我把子线程也写成AsyncTask的话,在android1.6和2.1中这个问题就可以解决,但是在android1.5中就不行了,我想在android1.5中也能运行
      

  5.   

        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);        mStart = (Button)findViewById(R.id.start);
            
            mThread1 = new Thread(new Runnable() {
                public void run() {
                    while(true){
                        Log.i("Young", "mThread1");
                    }
                }
            });
            
            mThread2 = new Thread(new Runnable() {
                public void run() {
                    while(true){
                        Log.i("Young", "mThread2");
                    }
                }
            });
            
            mStart.setOnClickListener(new OnClickListener() {
                
                public void onClick(View arg0) {
                    mThread2.start();
                }
            });
            mThread1.start();
        }我是这么来做的,结果是正常打印语句。
    楼主在启动B时,使用的B.start(),还是B.run()的方法呢?
      

  6.   

    当然是B.start()啦,B是可以正常运行的,我的问题是为什么要B运行完后C才会执行,明明是独立的线程来的,又没啥关系,子线程又没涉及到任何UI
      

  7.   

    C用AsyncTask是涉及UI操作的,问题就是要等B执行后后,才可以进行UI操作
      

  8.   


    上面说过了,是ui子类的, 看看sdk怎么描述的吧,楼上的某位不会看不懂subclassed是什么意思吧 AsyncTask must be subclassed to be used. The subclass will override at least one method 
      

  9.   

    刷ui用 publishProgress(Progress...),重写 onProgressUpdate
    方法就行了
      

  10.   

    我再详细点描述一下吧,我在主Activity进入另一个Activity,然后单击触发事件,触发事件有两个操作:“1,返回主Activity  2,启动一个静态对象里的一个子线程(这个线程不涉及任何UI操作)”,回主Activity后,你单击触发事件,这个触发事件是:“调用AsyncTask改变主Activity的组件的”
    问题:只有等子线程(这个线程不涉及任何UI操作)运行结束后,才能改变主Activity的组件
    我的解决方法:把子线程(这个线程不涉及任何UI操作)也写成AsyncTask,在android1.6和2.1测试通过,但在android1.5又是只有等子线程(这个线程不涉及任何UI操作)运行结束后,才能改变主Activity的组件。
    请问有方法在android1.5,1.6,2.1都可以解决这个问题的方法吗
      

  11.   

    1. AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行, 这就有效地避免了使用Handler带来的麻烦
    2.需要注意的是AsyncTask一定要在主线程中创建实例
    3.AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用
    4.* onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
        * doInBackground(Params...) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
        * onProgressUpdate(Progress...) 此方法在主线程执行,用于显示任务执行的进度。
        * onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。