Нить только петли один раз - PullRequest
1 голос
/ 06 ноября 2011

Я думал об этом часами, и я не ближе к решению!Мой поток просто перестает зацикливаться, когда я по какой-то причине извлекаю сообщение с сервера, и прекрасно работает, когда я этого не делаю.

Это работает и печатает обновление каждую секунду:

 public class ChatRoom extends Activity implements OnClickListener, Runnable {
        private Thread t = new Thread(this);

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.chatroom);

                Button send = (Button) findViewById(R.id.send);
                send.setOnClickListener(this);

                Intent receiver = getIntent();
                String host = receiver.getStringExtra("Host");
                int port = receiver.getIntExtra("Port", 4456);


                try
                {
                    socket = new Socket(host, port);
                    this.receive = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
                    this.send = new PrintWriter(this.socket.getOutputStream(), true);

                } 
                catch(IOException ioe) { System.out.println(ioe); }
                t.start();


            }

            public void run()
            {
                String message = "";

                while(true)
                {
                    try
                    {
                        // message = receive.readLine(); BufferedReader
                        t.sleep(1000);
                    } 
                    //catch(IOException ioe)            { System.out.println(ioe); }
                    catch (NullPointerException npe)    { System.out.println(npe); } 
                    catch (InterruptedException e)      { System.out.println(e);   }

                    System.out.println("Refreshing...");

                }
            }

когда я использую свой закомментированный код, он на самом деле работает, и я получаю сообщение от сервера, но он зацикливается только один раз!Это почему?

Output:
Server Message
Refreshing...

Я не получаю никаких исключений или ошибок, но раньше у меня была ошибка с некоторым подобным кодом, который сказал, что я не могу изменить интерфейс в других потоках.Так что я смотрел на какой-то runOnUiThread, но он не улучшил его, и я не знаю, почему он должен: (

Ответы [ 3 ]

3 голосов
/ 06 ноября 2011

Метод BufferedReader.readLine() блокируется до получения символа новой строки.Если в потоке приемника нет новой строки, он будет заблокирован навсегда.

3 голосов
/ 06 ноября 2011

Несколько вещей здесь:

  • Swap from System.out.println («строка»); в Log.d («тэг», «строка»); затем посмотрите на DDMS для строк вывода.

Я не думаю, что вы создаете поток должным образом, и вы, конечно, не предоставляете никакого интерфейса для его уничтожения, что может вызвать проблемы при тестировании. Я бы разделил тему на новый файл, скажем NameOfThread:

//File "NameOfThread"
public class NameOfThread extends Thread{
//any fields you want here to mess with e.g.
private String message;
private boolean running;


public NameOfThread(){
    message = "";
    running = true;
}

@Override
public void run(){
    while(running){
        //do stuff
    }   
}

public void setRunning(boolean run){
    running = run;
}   

}

//When you want to call it
NameOfThread varThread = new NameOfThread();
varThread.start();

//when you want to kill the thread
varThread.setRunning(false);

Вы можете подумать: «Зачем беспокоиться об этом целом running мусорном хранилище, мне это не нужно». но как еще закончится эта нить изящно? Есть еще один метод правильного уничтожения потока, который использует InterruptedException, и ваш код очистки идет туда, но это всего лишь альтернатива.

Попробуйте сначала сделать это, затем вам нужно разобраться в самом сообщении (метод, который вы используете в настоящее время, не очень хорош, так как readLine() будет блокировать до получения строки (что означает, что вы получите "Обновление"). ... "когда вы получаете новую строку, а не раз в секунду.

0 голосов
/ 06 ноября 2011

Вы наверняка получаете некоторые исключения, вы просто не видите их, потому что пытаетесь напечатать их на стандартном выводе, который отсутствует в Android. Ваше исключение обработано правильно, и код завершается. Чтобы правильно получить информацию об исключении, используйте Logs или просто наберите RuntimeException. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...