Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
DrTorqux
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 8
1

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

10.10.2014, 11:39. Просмотров 2025. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2014, 11:39
Ответы с готовыми решениями:

Can't create handler inside thread that has not called Looper.prepare()
Привет, с Новым Годом! Подскажите почему приложение вылетает с ошибкой при...

() 0xfffffff9
<syknal homdler caltid>() 0xfffffff9 Подскажите пожалуйста что это такое и...

Как вытащить из свойства fields recordset вытащить данные в массив
Как вытащить из свойства fields recordset вытащить данные в массив...

Как становить выполнение потока Thread
Здравствуйте друзья. Я запускаю метод пинга адресов в потоке ()ниже пиведен...

Abort has been called при создании потока
С помощью CreateRemoteThread запускаю новый поток, в котором примерно...

3
turbanoff
Эксперт Java
4019 / 3754 / 742
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
10.10.2014, 12:27 2
DrTorqux, на какой именно строчке ошибка? Можете привести полный stacktrace?
0
DrTorqux
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 8
10.10.2014, 14:46  [ТС] 3
Ошибка возникает при попытке вызвать
Java
1
handledata(answer);
. Работу приложения она не прекращает, но handledata не вызывает.

Добавлено через 1 час 20 минут
Прошу закрыть тему. Порылся в сети, нашел решение. Как и предполагал, нужно было handledata(answer); выполнять в главном потоке. Спасибо turbanoff.
0
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 115
30.05.2015, 21:13 4
turbanoff, помогите мне, а то у меня тоже ошибка 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
public class NewThread implements Runnable {
    Thread thread;
 
    // konstruktor
    public NewThread() {
        // new potok
        thread = new Thread(this, "VKparser");
        thread.start();
    }
 
    public void run() {
        String httpString = "https://api.vk.com/method/users.get?user_id=205387401&v=5.32";
 
        HttpPost httppost = new HttpPost(httpString);
        HttpClient httpclient = new DefaultHttpClient();
 
        HttpResponse response;
 
        String responseBody;
 
        try {
 
            response = httpclient.execute(httppost);
            responseBody = EntityUtils.toString(response.getEntity());
            Log.d("!!!!!!!!!!!!!!!", responseBody);
            try {
                JSONObject jsonobject = new JSONObject(responseBody);
                JSONArray jsonarray = jsonobject.getJSONArray("response");
                jsonobject = jsonarray.getJSONObject(0);
                String name, famil;
                name = jsonobject.getString("first_name");
                famil = jsonobject.getString("last_name");
                Log.d("!!!", name);
                Log.d("!!!", famil);
                try {
                    MainActivity.getInstance().update();
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

а вот код update() в MainActivity
Кликните здесь для просмотра всего текста
Java
1
2
3
public void update() {
        Toast.makeText(getBaseContext(), "YES ", Toast.LENGTH_LONG).show();
    }


кстати у меня вылетает приложение... и вот еще немного ошибок
05-31 00:15:40.998: E/AndroidRuntime(10441): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-31 00:15:40.998: E/AndroidRuntime(10441): at android.os.Handler.<init>(Handler.java:121)
05-31 00:15:40.998: E/AndroidRuntime(10441): at android.widget.Toast$TN.<init>(Toast.java:322)
05-31 00:15:40.998: E/AndroidRuntime(10441): at android.widget.Toast.<init>(Toast.java:91)
05-31 00:15:40.998: E/AndroidRuntime(10441): at android.widget.Toast.makeText(Toast.java:238)
05-31 00:15:40.998: E/AndroidRuntime(10441): at com.example.jsonparser.MainActivity.update(MainActivity.java:24)
05-31 00:15:40.998: E/AndroidRuntime(10441): at com.example.jsonparser.NewThread.run(NewThread.java:52)
05-31 00:15:40.998: E/AndroidRuntime(10441): at java.lang.Thread.run(Thread.java:856)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2015, 21:13

Передача сообщения из потока. Handler
Добрый день, пытаюсь передать сообщение через Handler из потока, для обновления...

QThread::start: Failed to create thread
При скачивание фалов выдает ошибку QThread::start: Failed to create thread.Как...

Ошибка Cannot create children for a parent that is in a different thread
Написал класс для работы с http запросами #ifndef HTTP_REQUEST_H #define...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru