Форум программистов, компьютерный форум CyberForum.ru

Как вытащить данные из потока. 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 MainActivity extends ActionBarActivity { Button btnSave, btnRead; EditText eText; TextView tView; http://www.cyberforum.ru/android-dev/thread1272347.html
Upload to server Программирование Android
Доброго всем вечера! Столкнулся с такой проблемой: делаю загрузку файла на сервер в сеовисе, но загвоздка в том что файлы больше 600кб не грузятся, пробовал разные способы и разные сервера, результат тот же: до 600кб файлы стабильно загружаются на сервер, больше 600кб нет. Может кто сталкивался с такой проблемой? Посоветуйте решение. Вот сам сервис. public class UploaderService extends...
Программирование Android ERROR: x86 emulation currently requires hardware acceleration
Здравствуйте. Помогите пожалуйста разобраться с ошибкой. До того как я столкнулся с этой ошибкой , эмуляторы на платформе "Intel Atom(x86) запускались нормально. Я пытался установить библиотеку support-v7 , и предположительно после этого начала возникать эта ошибка . Что бы избавиться от неё ,я переустановил SDK и Ecliopse, но ошибку так и не смог устранить. При запуске AVD, виртуального...
Программирование Android Чёрный экран OpenGL ES 1.0 http://www.cyberforum.ru/android-dev/thread1271986.html
Я написал простенькую игру на OpenGL ES 1.0. Игра работает нормально, но почему-то когда во время игрового процесса нажимаешь кнопку домой, а потом, когда через несколько секунд пытаешься восстановить её из диспетчера задач, она показывает только чёрный экран, хотя если попытаться восстановить игру из диспетчера задач почти сразу после сворачивания, игра восстанавливается, как нужно. Кто знает,...
Программирование Android Appcompat_v7 Подскажите, пожалуйста, что за библиотека это такая (appcompat_v7) и для чего она нужна. Так как я её не использую, я удалил все упоминания о ней в файлах и удалил ссыль на эту библиотеку в свойствах проекта. В результате файл (APK) уменьшился на чуть больше чем 500 КБ. Но при загрузке обновлённого файла на Play маркет у меня удалилась поддержка 50+ языков. А может есть способ убрать эту... подробнее

Показать сообщение отдельно
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. Просмотров 1428. Ответов 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();
        }
    }
}


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

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