С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare() - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Создать двумерный массив кнопок http://www.cyberforum.ru/android-dev/thread1272373.html
можно ли как-то легко создать масив ХнаХ кнопок, при етом, чтоб легко можно было распознать какая кнопканажата ( к примеру, чтоб при нажатии кнопки из масива, выводило ее номера-положение в массиве)?
Программирование Android Сохранение введенных пользователем данных Ребят прошу вашей помощи, возникла проблема, при записи введенных данных в текстовый файл, блок try{}catch(){} постоянно выдает исключение в чем может быть проблема? код Main: public class... http://www.cyberforum.ru/android-dev/thread1272347.html
Upload to server Программирование Android
Доброго всем вечера! Столкнулся с такой проблемой: делаю загрузку файла на сервер в сеовисе, но загвоздка в том что файлы больше 600кб не грузятся, пробовал разные способы и разные сервера, результат...
Программирование Android ERROR: x86 emulation currently requires hardware acceleration
Здравствуйте. Помогите пожалуйста разобраться с ошибкой. До того как я столкнулся с этой ошибкой , эмуляторы на платформе "Intel Atom(x86) запускались нормально. Я пытался установить библиотеку...
Программирование Android Чёрный экран OpenGL ES 1.0 http://www.cyberforum.ru/android-dev/thread1271986.html
Я написал простенькую игру на OpenGL ES 1.0. Игра работает нормально, но почему-то когда во время игрового процесса нажимаешь кнопку домой, а потом, когда через несколько секунд пытаешься...
Программирование Android Appcompat_v7 Подскажите, пожалуйста, что за библиотека это такая (appcompat_v7) и для чего она нужна. Так как я её не использую, я удалил все упоминания о ней в файлах и удалил ссыль на эту библиотеку в... подробнее

Показать сообщение отдельно
DrTorqux
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 8

Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare() - Программирование Android

10.10.2014, 11:39. Просмотров 1667. Ответов 3
Метки (Все метки)

В общем столкнулся со следующей неприятной проблемой.
Есть клиент. Он запрашивает у сервера некоторые данные. Сервер эти данные посылает клиенту. Клиент эти данные принимает и продолжает слушать входящие сообщения. Но проблемы начинаются когда я пытаюсь эти данные вытащить из потока в другой класс.
Ошибка при попытке передать данные из потока в datahandler: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Вот код клиента
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.noldorknight.waiterapp;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class SocketServer {
 
    private Socket socket;
    private static final int SERVERPORT = 11000;
    private static String SERVER_IP = "192.168.2.222";
    String answer;
    private static String cmdtext;
    private static int callerid;
 
   class ClientThread implements Runnable  
   {
       public void run() {
 
            try {  //Здесь мы создаем сокет
               InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
               socket = new Socket(serverAddr, SERVERPORT);
            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
           senddata(); //Здесь запускаем функцию для отправки запроса серверу
 
        }
    }
   //////////////////////////////////////// Эта функция вызывается из отдельного класса, 
   ////////////////////////////////////////того самого которому нужно вернуть ответ
   public void setserver (String command, int caller)
   {
       callerid = caller; //это просто чтобы знать из какого класса была вызвана функция(так как их будет много, и                    //////////////////////////каждый с разным запросом)
        cmdtext = command; //это текст запроса
        new Thread(new ClientThread()).start(); //запускаем поток, тот что сверху
   }
 
    private void handledata(String answer) ///эта функция отсылает целевому классу ответ
    {
        Login lgn = new Login();
        lgn.geturdata(answer);
    }
 
   private void senddata() //отсылаем запрос и слушаем ждем ответа
   {
        try {
            String str = cmdtext;
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            out.println(str);
            out.flush();
            System.out.println("-------Начинаем прием данных");
            byte[] data = new byte[256];
            while (true) {
                InputStream inp = socket.getInputStream();
                inp.read(data);
                System.out.println("-------Byte data= " + data);
                answer = new String(data, "UTF-8");
                System.out.println("-------String data= " + answer);
              handledata(answer);  ///// ответ от сервера должен быть передан в другой класс 
 
            }
 
            }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


Насколько я понял передача данных должна быть в том же потоке, в котором исполняется целевой класс. Как с этим бороться? Мне нужно передать эти данные в главный поток? Или же в отдельный поток?

И еще один вопрос. Как вы видите в отдельном потоке создается новый сокет и начинается обмен данными. Если я вызову передачу данных снова, то и сокет создастся новый, что не есть хорошо. мне нужно поместить создание сокета в отдельный поток? Вообще нужен ли отдельный поток для создания сокета?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.