Android Thread и вопрос поведения класса - PullRequest
0 голосов
/ 30 декабря 2010

Проект, над которым я работаю, нуждается в таком типе поведения.Пользователю будет представлен пользовательский интерфейс, который даст ему возможность подключаться и отключаться от сервера.Я также хотел бы, чтобы этот интерфейс отображал состояние соединения, «подключен или отключен».Всякий раз, когда пользователь нажимает кнопку подключения, приложение запускает поток, который обрабатывает подключение к серверу.Пользователь по-прежнему будет смотреть на основной интерфейс.Когда они запускают это соединение и пока оно остается, я бы хотел, чтобы статус соединения был «подключен».Если в какой-либо момент соединение разорвано, я бы хотел, чтобы оно отображалось как отключенное.Ниже перечислено то, что у меня есть.

Мой вопрос ... Правильно ли я делаю потоки?Чтобы телефон не прерывался подключением к серверу, когда он подключен?

Кроме того, как получить основной интерфейс, отображающий состояние подключения сервера и отображаемый при разрыве подключения?*

Заранее спасибо!Если у вас есть дополнительные вопросы, пожалуйста, дайте мне знать.

The server connection thread.

public class ConnectDevice implements Runnable {

    private boolean connected;
    private ObjectInputStream ois;

    public void run() {
        try {
            InetAddress host = InetAddress.getByName("192.168.234.1");
            Socket socket = new Socket(host.getHostName(), 7777);
            connected = true;


            while (connected) {
                try {
                    ois = new ObjectInputStream(socket.getInputStream());
                    String message = (String) ois.readObject();
                    System.out.println("Message: " + message);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
            ois.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            connected = false;
        } catch (IOException e) {
            e.printStackTrace();
            connected = false;
        } /*catch (ClassNotFoundException e) {
            e.printStackTrace();
            connected = false;
        }*/
    }
}



The main UI and main class.

public class SmartApp extends Activity 
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intro);

        final Button firstTimeButton = (Button) findViewById(R.id.firstTimeButton);
        firstTimeButton.setOnClickListener(
        new View.OnClickListener()
        {
            @Override
            public void onClick(View v) 
            {
                // TODO Auto-generated method stub
                Intent userCreationIntent = new Intent(v.getContext(), UserCreation.class);
                startActivityForResult(userCreationIntent, 0);
            }
        });

        final Button connectDeviceButton = (Button) findViewById(R.id.connectDeviceButton);
        connectDeviceButton.setOnClickListener(
        new View.OnClickListener()
        {   
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //Intent connectDeviceIntent = new Intent(v.getContext(), ConnectDevice.class);
                //startActivityForResult(connectDeviceIntent, 0);

                Thread cThread = new Thread(new ConnectDevice());
                cThread.start();
            }
        });
    }
}

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

В Android есть поток пользовательского интерфейса, который является единственным потоком, которому разрешено обновлять элементы пользовательского интерфейса.

Вам необходим фоновый поток, выполняющий работу, и отправляющий сообщение обратно в поток пользовательского интерфейса после его завершения.AsyncTask - это класс Android, предназначенный именно для этого.

Как только ваш рабочий поток завершит свою работу и обновит элемент пользовательского интерфейса, полученный с помощью findViewById, он автоматически изменится на экране без необходимости делать что-либо еще.

1 голос
/ 30 декабря 2010

Проверьте AsyncTask , он специально создан для такого рода вещей.

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