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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Java Сети Переделать под андроид http://www.cyberforum.ru/android-dev/thread1271970.html
Переделайте пожалуйста эту программу под андроид, и чтобы она никакие данные не отправляла если она это делает, вот прога - http://rghost.ru/58429238
Java Сети Простой клиент-сервер Добрый день/ вечер/ночь/ утро Смотрю простой пример клиент-сервера(а в этом деле я профан) import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; http://www.cyberforum.ru/android-dev/thread1270837.html
Java Сети Получить файлы/ссылку на файлы из Google Drive
Здравствуйте, нужно сделать программу, которая будет получать файлы которые есть на диске гугл или хотябы ссылку на скачивание етих файлов. Google Developers надает библиотеку и даже готовый семпл к примеру: семпл для загрузки файлов с диска, но он не работает import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpResponse; import...
Java Сети FTP client ошибка при скачивании файла
добрый вечер! Вопрос такой: При скачивании файла с FTP обрывается сеть и программа не выдает exception и зависает. помогите реализовать этот код листинг программы: import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.net.ftp.FTPClient;
Java Сети JSF 1.2 + javascript http://www.cyberforum.ru/android-dev/thread1268643.html
Есть веб-проект на jsf 1.2. Есть написаная для примера javascript функция, выполнение которой хочется повесить на нажатие кнопки. Ф-ия: function simpleFunction(){ var x = document.getElementById('check').value; if(x != null){ alert("NOT NULL"); } }
Java Сети Независимая обработка пользователей (основа) Всем привет. Я новичек в java и покачто совсем мало про него знаю, так что не ругайте сильно. У меня есть сервер, к которому подключаются несколько клиентов (10 - 1000). Мне необходимо, чтобы каждый пользователь обробатывался независемо от других пользователей (как бы параллельно с другими) и программа не заставляла других пользователей, ожидать пока первый пользователь "обработается".... подробнее

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


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

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