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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
DrTorqux
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 8
#1

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

10.10.2014, 11:39. Просмотров 1476. Ответов 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();
        }
    }
}


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

И еще один вопрос. Как вы видите в отдельном потоке создается новый сокет и начинается обмен данными. Если я вызову передачу данных снова, то и сокет создастся новый, что не есть хорошо. мне нужно поместить создание сокета в отдельный поток? Вообще нужен ли отдельный поток для создания сокета?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2014, 11:39     Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare()
Посмотрите здесь:

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

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

Передать данные в работающий thread из другого thread - Программирование Android
Есть 2 потока запущенные разными классами и из потока А нужно сообщить потоку Б что бы он запустил свою определенную функцию. Ссылки на...

Как передать данные в thread? - Программирование Android
Доброго всем дня) Прошу совета. Есть активити. Она запускает сервис,в котором стартует поток, опрашивающий удаленный сервер по заранее...

Как забрать данные из отработавшего потока? - Программирование Android
Код в потоке сгенерил массив интов и завершился.Как забрать данные? ЗЫ:в жабе есть какой то аналог WaitForSingleObject ?

Handler - Программирование Android
Вот допустим обьект Handler был создан в активити(то есть в главном потоке). И мы запускаем через этот Handler (его метод post) кусок кода...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
turbanoff
Модератор
Эксперт Java
3925 / 3660 / 445
Регистрация: 18.05.2010
Сообщений: 9,229
Записей в блоге: 11
Завершенные тесты: 1
10.10.2014, 12:27     Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare() #2
DrTorqux, на какой именно строчке ошибка? Можете привести полный stacktrace?
DrTorqux
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 8
10.10.2014, 14:46  [ТС]     Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare() #3
Ошибка возникает при попытке вызвать
Java
1
handledata(answer);
. Работу приложения она не прекращает, но handledata не вызывает.

Добавлено через 1 час 20 минут
Прошу закрыть тему. Порылся в сети, нашел решение. Как и предполагал, нужно было handledata(answer); выполнять в главном потоке. Спасибо turbanoff.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2015, 21:13     Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare()
Еще ссылки по теме:

Handler - Программирование Android
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import...

Handler timer - Программирование Android
Добрый вечер. С помощью какого метода в Handler http://developer.android.com/reference/android/os/Handler.html(беда пока с английским) ,...

Не работает Handler - Программирование Android
Я нахожусь на 66 уроке startandroid, здесь упоминается Handler. Почему то отсутствуют у меня методы, которые описываются тут. Вот фрагмент...

Handler, поток не останавливается - Программирование Android
Добрый вечер. Не могу остановить таймер, при переходе на другую Activity. Возможно ли это вообще? Code: mport...

Handler и интервал времени - Программирование Android
Создаю хэндлер: Handler h = new Handler(); h.post(obrtimer); Runnable obrtimer = new Runnable() { public void run() { ...

Handler vs Service vs AsynkTask - Программирование Android
Есть 2 Activity, пусть A1 и A2. В методе onCreate() Activity A1 запускается новый поток, в котором определяются координаты местоположения...


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

Или воспользуйтесь поиском по форуму:
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 103
30.05.2015, 21:13     Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare() #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)
Yandex
Объявления
30.05.2015, 21:13     Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare()
Ответ Создать тему
Опции темы

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