3个线程+ 3个处理程序不起作用

时间:2012-11-03 13:50:36

标签: android multithreading handlers

我在每个线程中有3个线程和1个处理程序。但它只能工作一个,其他2个处理程序完全清除textview。

代码:

 Thread getServerStatus = new Thread() {                     
        public void run() {                                                                         
            Document doc;
            try {
                doc = dereference("my url");
                String text = doc.select("div#serverstatus").toString();
                Message msg = handler_serverstatus.obtainMessage();
                msg.obj = text;
                handler_serverstatus.sendMessage(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        Handler handler_serverstatus = new Handler()
        {
            public void handleMessage(Message msg)
            {
                 String text = (String)msg.obj;
                 TextView tv = (TextView)findViewById(R.id.server_status);
                 if(text.contains("online")) {
                     //tv.setTextColor(2);
                     tv.setText("online");
                 } else if(text.contains("offline")) {
                     tv.setText("offline");
                 } else {
                     tv.setText("Error #1");
                 }
            }

        };
    };

    Thread getPlayersOnline = new Thread() {                     
        public void run() {                                                                         
            Document doc;
            try {
                doc = dereference("my url");
                String text = doc.select("div#players_on").toString();
                Message msg = handler_players.obtainMessage();
                msg.obj = text;
                handler_players.sendMessage(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        Handler handler_players = new Handler()
        {
            public void handleMessage(Message msg)
            {
                 String text = (String)msg.obj;
                 TextView tv = (TextView)findViewById(R.id.players_online);
                 text = text.replace("<div id=\"players_on\">", "");
                 text = text.replace("</div>", "");
                 tv.setText(text);
            }

        };
    };

    Thread getPlayersMax = new Thread() {                     
        public void run() {                                                                         
            Document doc;
            try {
                doc = dereference("url");
                String text = doc.select("div#players_max").toString();
                Message msg = handler_players_max.obtainMessage();
                msg.obj = text;
                handler_players_max.sendMessage(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        Handler handler_players_max = new Handler()
        {
            public void handleMessage(Message msg)
            {
                 String text = (String)msg.obj;
                 TextView tv = (TextView)findViewById(R.id.players_max);
                 text = text.replace("<div id=\"players_max\">", "");
                 text = text.replace("</div>",  "");
                 tv.setText(text);
            }

        };
    };

    public void ButtonClick(View view) throws IOException {
        getServerStatus.start();
        getPlayersOnline.start();
        getPlayersMax.start();
    }

    private Document dereference(String uri) throws IOException {
        Connection connection = Jsoup.connect(uri);
        return connection.get();
    }

这可能完全错了吗?

1 个答案:

答案 0 :(得分:1)

使用

ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(1); // number of working thread 
Runnable getServerStatus = new Runnable() {
        @Override
        public void run() {
             Document doc;
                try {
                    doc = dereference("my url");
                    String text = doc.select("div#serverstatus").toString();
                    Message msg = handler_serverstatus.obtainMessage();
                    msg.obj = text;
                    handler_serverstatus.sendMessage(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

           Handler handler_serverstatus = new Handler()
            {
                public void handleMessage(Message msg)
                {
                     String text = (String)msg.obj;
                     TextView tv = (TextView)findViewById(R.id.server_status);
                     if(text.contains("online")) {
                         //tv.setTextColor(2);
                         tv.setText("online");
                     } else if(text.contains("offline")) {
                         tv.setText("offline");
                     } else {
                         tv.setText("Error #1");
                     }
                }

            };


    };
    Runnable getPlayersOnline = new Runnable() {
        @Override
         public void run() {                                                                         
                Document doc;
                try {
                    doc = dereference("my url");
                    String text = doc.select("div#players_on").toString();
                    Message msg = handler_players.obtainMessage();
                    msg.obj = text;
                    handler_players.sendMessage(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            Handler handler_players = new Handler()
            {
                public void handleMessage(Message msg)
                {
                     String text = (String)msg.obj;
                     TextView tv = (TextView)findViewById(R.id.players_online);
                     text = text.replace("<div id=\"players_on\">", "");
                     text = text.replace("</div>", "");
                     tv.setText(text);
                }

            };
    }

    Runnable getPlayersMax = new Runnable() {

          public void run() {                                                                         
                Document doc;
                try {
                    doc = dereference("url");
                    String text = doc.select("div#players_max").toString();
                    Message msg = handler_players_max.obtainMessage();
                    msg.obj = text;
                    handler_players_max.sendMessage(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            Handler handler_players_max = new Handler()
            {
                public void handleMessage(Message msg)
                {
                     String text = (String)msg.obj;
                     TextView tv = (TextView)findViewById(R.id.players_max);
                     text = text.replace("<div id=\"players_max\">", "");
                     text = text.replace("</div>",  "");
                     tv.setText(text);
                }

            };
    };
    newFixedThreadPool.submit(getServerStatus);
    newFixedThreadPool.submit(getPlayersOnline);
    newFixedThreadPool.submit(getPlayersMax); // submit all your targets
}

 public void ButtonClick(View view) throws IOException {
        newFixedThreadPool.shutdown();// shutdown and execute it 
    }

内部有3个可运行; 阅读有关ThreadPools http://www.vogella.com/articles/JavaConcurrency/article.htmlhttp://www.caveofprogramming.com/java/java-multithreading-thread-pools-video-tutorial-part/

的教程

或使用synchronized块{};

包装run()目标