在为android编程时出现MultiThreading问题

时间:2011-01-04 10:44:11

标签: android multithreading

我正在使用Android进行开发,但这个问题在任何其他Java平台上都可能同样有用。

我开发了一个多线程应用程序。假设我有一个需要执行时间密集型任务的第一类,因此这项工作在另一个Thread中完成。 完成后,相同的Thread会将时间密集型任务结果返回给另一个(第3个)类。

这最后一节课会做一些事情并将结果返回给第一个起始课。 我注意到虽然第一堂课将一直等待,也许是因为这是某种循环?

此外,我希望Thread-class能够自行停止,就像它将结果传递给第三类一样,它应该停止。第三类必须在没有被“封装”在第二类(线程一)的情况下完成它的工作。 谁知道如何做到这一点?

现在的经验是,第一个似乎在等待(挂起),直到第二个和第三个完成:(

4 个答案:

答案 0 :(得分:11)

如果你想使用线程而不是AsyncTask,你可以这样做:

private static final int STEP_ONE_COMPLETE = 0;
private static final int STEP_TWO_COMPLETE = 1;

...

private doBackgroundUpdate1(){
    Thread backgroundThread = new Thread() {
        @Override
        public void run() {
            // do first step

            // finished first step
            Message msg = Message.obtain();
            msg.what = STEP_ONE_COMPLETE;
            handler.sendMessage(msg);
        }
    }
    backgroundThread.start();
}
private doBackgroundUpdate2(){
    Thread backgroundThread = new Thread() {
        @Override
        public void run() {
            // do second step

            // finished second step
            Message msg = Message.obtain();
            msg.what = STEP_TWO_COMPLETE;
            handler.sendMessage(msg);
        }
    }
    backgroundThread.start();
}
private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch(msg.what){
        case STEP_ONE_COMPLETE:
            doBackgroundUpdate2();
            break;
        case STEP_TWO_COMPLETE:
            // do final steps;
            break;
        }
    }
}

您可以致电doBackgroundUpdate1()将其打开,完成后会向handler发送消息,然后启动doBackgroundUpdate2()等。

答案 1 :(得分:2)

老虎,

  

TiGer写道:

     

完成相同的线程后   返回耗时的任务结果   到另一个(第三)课

由于线程异步运行,因此您的非线程类无法与您的线程同步 虽然要对活动执行某些操作,但您需要AsyncTask而非A线程

  

TiGer写道:

     

也许是因为这是某种形式   循环?

Tiger会详细了解Threads和concurrency

所以我现在唯一的答案是 ASYNCTASK

编辑:

  

我还想让Thread-class停下来   本身

阅读这篇文章的how-do-you-kill-a-thread-in-java

答案 2 :(得分:0)

在普通的Java中,你会这样做:

class MyTask implements Runnable {
    void run() {
       for (int i = 0; i < Integer.MAX; i++) {
          if (i = Integer.MAX -1) {
              System.out.println("done");
          }
       }
    }
}


class MyMain {
    public static void main(String[] argv) {
        for (int i = 0; i < 10; i++) {
           Thread t = new Thread(new MyTask());
           t.start();
        }
        System.out.println("bye");
    }
}

......开始了10个主题。请注意,如果您不小心调用了t.run()而不是t.start(),那么您的runnable将在主线程中执行。可能你会在10'完成'之前看到'再见'。请注意,当您给它们的Runnable的run()方法完成时,线程“停止”。

我希望这能帮助你了解你必须协调的事情。

兼并的棘手部分是让线程相互通信或共享对象的访问权。

我相信Android以Handler的形式为此提供了一些机制,designing for responsiveness下的开发者指南中对此进行了描述。

关于Java并发主题的优秀书籍是Java Concurency in Practice

答案 3 :(得分:0)

如果你想使用$string = 'gardens, countryside' $username ='@teddy135'而不是线程在android中 我已经使用Android中的AsyncTask和Handler解决了这个问题,目的是在编译一个任务后执行一个任务。听到的是在编译该进程后显示第一个加载动画的代码,它将进入另一个页面

ASyncTask