Как правильно работать в джаве с HttpConnection библиотеки java.io? Когда я пытаюсь подключиться к серверу программа зависает.
Зависает при попытке подключиться.
Короче вот листинг:
try {
HttpConnection conn = null;
InputStream is = null;
int rc;
conn = (HttpConnection)Connector.open("http://google.ru/"); //Вот тут она и подвисает
...
} catch(IOException ioe) {
...
}
Подключение так и не происходит
Здравствуйте, UnConst, Вы писали:
UC>Как правильно работать в джаве с HttpConnection библиотеки java.io? Когда я пытаюсь подключиться к серверу программа зависает. UC>Зависает при попытке подключиться. UC>Короче вот листинг: UC>try { UC>HttpConnection conn = null; UC>InputStream is = null; UC>int rc; UC>conn = (HttpConnection)Connector.open("http://google.ru/"); //Вот тут она и подвисает UC>... UC>} catch(IOException ioe) { UC>... UC>} UC>Подключение так и не происходит
на чем это не работает. какой эмулятор или модель телефона
код правильный. и должен бы работать.
Здравствуйте, UnConst, Вы писали:
UC>Как правильно работать в джаве с HttpConnection библиотеки java.io? Когда я пытаюсь подключиться к серверу программа зависает. UC>Зависает при попытке подключиться.
Перенесите логику подключения в отдельный поток, т.к. я так понял, что у вас она работает в главном потоке.
Здравствуйте, Passer, Вы писали:
P>на чем это не работает. какой эмулятор или модель телефона P>код правильный. и должен бы работать.
Эмулятором я пользуюсь стандартым, с пакета j2mewtk2.2, который входит в JBuilder5. А телефон у меня Nokia6020.
Запрос на подключение появляется, но после подтверждения зависает. А в телефоне появляется ошибка Illegal State java/lang/IllegalStateException.
Здравствуйте, Crypto, Вы писали:
C>Перенесите логику подключения в отдельный поток, т.к. я так понял, что у вас она работает в главном потоке.
С потоками, к сожалению не дружу. Вы не можете мне пример показать? Я пробовал функцию в отдельный поток перенести, но у я ее потом не смог ее запустить в программе, чего-то не хватало, видать...
Здравствуйте, UnConst, Вы писали:
UC>Здравствуйте, Passer, Вы писали:
P>>на чем это не работает. какой эмулятор или модель телефона P>>код правильный. и должен бы работать.
UC>Эмулятором я пользуюсь стандартым, с пакета j2mewtk2.2, который входит в JBuilder5. А телефон у меня Nokia6020. UC>Запрос на подключение появляется, но после подтверждения зависает. А в телефоне появляется ошибка Illegal State java/lang/IllegalStateException.
очень советую использовать sony erricson
а то так и замучатся не долго. под ним с сетевыми обрашениями проблем особых не бывает. на телефоне будет сложнее т.к. придется разбератся с настройками безопасности или подписывать мидлет.
Здравствуйте, UnConst, Вы писали:
UC>Здравствуйте, Crypto, Вы писали:
C>>Перенесите логику подключения в отдельный поток, т.к. я так понял, что у вас она работает в главном потоке.
UC>С потоками, к сожалению не дружу. Вы не можете мне пример показать? Я пробовал функцию в отдельный поток перенести, но у я ее потом не смог ее запустить в программе, чего-то не хватало, видать...
это не решит проблемы того что подключится не удается. зато вся прога при попытки подключится по http не будет зависать.
про потоки советую почитать доки.
коротко: создается клас реализуюший Runnable
при этом в классе должно быть метод run()
class NW implements Runnable{
public void run() {
}
}
в этом методе и описывается сто должно происхолить в отдельном потоке.
потом вызываем
Здравствуйте, Passer, Вы писали:
P>это не решит проблемы того что подключится не удается. зато вся прога при попытки подключится по http не будет зависать.
Вы уверены? А как насчет того, что как раз SonyEricsson дедлочатся при попытке выполнить HttpConnection, FileConnection из обработчика команд?
Может у топикстартера и проблемы с настройками gprs, но отдельный поток здесь жизненно необходим.
Здравствуйте, Passer, Вы писали:
P>очень советую использовать sony erricson P>а то так и замучатся не долго. под ним с сетевыми обрашениями проблем особых не бывает. на телефоне будет сложнее т.к. придется разбератся с настройками безопасности или подписывать мидлет.
Зачем мне sony erricson? Мне нужно что бы программа работала на всех телефонах.
Здравствуйте, Crypto, Вы писали:
C>Здравствуйте, Passer, Вы писали: C>Вы уверены? А как насчет того, что как раз SonyEricsson дедлочатся при попытке выполнить HttpConnection, FileConnection из обработчика команд? C>Может у топикстартера и проблемы с настройками gprs, но отдельный поток здесь жизненно необходим.
чесно говоря я о таком не слыхал . писал не один проект под сониерксон. и не разу на этом не лочился.
хотя все возможно. если есть такой баг на сориериксон то стоилобы попробовать и такое. хотя мону подкинуть
а вот на этом можно проверить в чем проблема.
public class Game extends MIDlet {
protected void startApp() throws MIDletStateChangeException {
canva c = new canva();
Display.getDisplay(this).setCurrent(c);
System.out.println("11" + "2" + "3" + "4");
try {
System.out.println("1");
HttpConnection hc = (HttpConnection) Connector.open("http://www.google.ru");
InputStream is = hc.openInputStream();
System.out.println("2");
int ch;
long len = hc.getLength();
byte[] b = new byte[is.available()];
is.read(b);
c.s=new String(b);
System.out.print(c.s);
c.repaint();
is.close();
hc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
protected void pauseApp() {
}
protected void destroyApp(boolean b) throws MIDletStateChangeException {
}
}
class canva extends Canvas {
public String s="";
protected void paint(Graphics graphics) {
graphics.setColor(255,255,255);
graphics.fillRect(0,0,176,208);
graphics.setColor(0);
graphics.drawRect(10,10,100,100);
graphics.drawString(s,1,1,Graphics.TOP | Graphics.LEFT);
}
}
Здравствуйте, UnConst, Вы писали:
UC>Здравствуйте, Passer, Вы писали:
UC>Зачем мне sony erricson? Мне нужно что бы программа работала на всех телефонах.
а причем тут это?? в просто в эмуляторе SE намного беньше заморочек. а то для того что бы работало под все телефоны нужно не использовать специфические для определенных моделей классы. типо com.nokia.mid.ui.FullCanvas и т.д.
и все будет нормально.
я тоже писал под все модели. и писал именно на SE
Здравствуйте, Passer, Вы писали:
P>а причем тут это?? в просто в эмуляторе SE намного беньше заморочек. а то для того что бы работало под все телефоны нужно не использовать специфические для определенных моделей классы. типо com.nokia.mid.ui.FullCanvas и т.д. P>и все будет нормально. P>я тоже писал под все модели. и писал именно на SE
Ну может быть его попробую. Только его у меня нет. И скачать варианта нет. Но в принципе я и этим доволен.
Сделал отдельным потоком подключение. Эмулятор не завис, зато теперь показывает то же самое что и мой телефон.
Здравствуйте, Passer, Вы писали:
P>а вот на этом можно проверить в чем проблема. P>
P>public class Game extends MIDlet {
P> protected void startApp() throws MIDletStateChangeException {
P> canva c = new canva();
P> Display.getDisplay(this).setCurrent(c);
P> System.out.println("11" + "2" + "3" + "4");
P> try {
P> System.out.println("1");
P> HttpConnection hc = (HttpConnection) Connector.open("http://www.google.ru");
P> InputStream is = hc.openInputStream();
P> System.out.println("2");
P> int ch;
P> long len = hc.getLength();
P> byte[] b = new byte[is.available()];
P> is.read(b);
P> c.s=new String(b);
P> System.out.print(c.s);
P> c.repaint();
P> is.close();
P> hc.close();
P> } catch (IOException e) {
P> e.printStackTrace();
P> }
P> }
P>
Это неправильно. Есть модели, которые при выполнении системных callback методов более какого-то времени, просто вырубят мидлет. Как уже сказал Crypto, создавать свою нить для сетевого взаимодействия надо обязательно.
Все заработал. Понял в чем была причина.
Проблема была в том, что открыв сокет я не удосуживался начинать с него чтение. Поэтому он вис и возникала ошибка. Большое спасибо Passer. Его код очень помог.
D>Это неправильно. Есть модели, которые при выполнении системных callback методов более какого-то времени, просто вырубят мидлет. Как уже сказал Crypto, создавать свою нить для сетевого взаимодействия надо обязательно.
я не спорю. но по моему данная проблема не от этого.
S_>SomeRunnable sr = new SomeRunnable();
S_>(new Thread(sr)).start();
S_>...
S_>data = sr.getReceivedData();
S_>...
S_>
Это интересно конечно. Но как это использовать в данном примере? В какой библиотеке лежит этот класс? Где пишутся эти строки? И как мне в MainClass получить значение переменной result класса TreadClass? Во сколько сразу вопросов у меня возникло. Вы меня извините, в джаве я новичок.