Проблема с сетью в Java ME - PullRequest
0 голосов
/ 06 февраля 2009

Хорошо, поэтому я использую Java ME для подключения к сценарию PHP на моем сервере, но по какой-то странной причине работа сети будет работать только при первом запуске приложения на телефоне после установки. В любое другое время он даже не спросит разрешения на использование сети. Вот метод, о котором идет речь:

private static String defaultURL = "http://www.roostercogburn.co.uk/proj/uploadScript.php";


public static String upload(String requeststring) {
    HttpConnection hc = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;
    StringBuffer messagebuffer = new StringBuffer();
    requeststring = "xml=" + requeststring;
    try {
        // Open up a http connection with the Web server
        // for both send and receive operations
        hc = (HttpConnection) Connector.open(defaultURL, Connector.READ_WRITE);
        // Set the request method to POST
        hc.setRequestMethod(HttpConnection.POST);
        // Send the string entered by user byte by byte
        dos = hc.openDataOutputStream();
        byte[] request_body = requeststring.getBytes();
        for (int i = 0; i < request_body.length; i++) {
            dos.writeByte(request_body[i]);
        }
        dos.flush();
        dos.close();
        // Retrieve the response back from the servlet
        dis = new DataInputStream(hc.openInputStream());
        int ch;
        // Check the Content-Length first
        long len = hc.getLength();
        if (len != -1) {
            for (int i = 0; i < len; i++) {
                if ((ch = dis.read()) != -1) {
                    messagebuffer.append((char) ch);
                }
            }
        } else {
            // if the content-length is not available
            while ((ch = dis.read()) != -1) {
                messagebuffer.append((char) ch);
            }
        }

        dis.close();

        hc.close();
    } catch (IOException ioe) {
        messagebuffer = new StringBuffer("ERROR!");
    } finally {
        // Free up i/o streams and http connection
        try {
            if (hc != null) {
                hc.close();
            }
        } catch (IOException ignored) {
        }
        try {
            if (dis != null) {
                dis.close();
            }
        } catch (IOException ignored) {
        }
        try {
            if (dos != null) {
                dos.close();
            }
        } catch (IOException ignored) {
        }
    }
    return messagebuffer.toString();
}

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 09 февраля 2009

Использование «static» напоминает мне, что виртуальные машины JavaME обычно не выгружают классы.

Я знаю, что, по крайней мере, на платформе Series40 процесс VM постоянно выполняется, поэтому статические переменные не сбрасываются, а код статической инициализации запускается только один раз.

Попробуйте выключить и снова включить телефон, чтобы убедиться, что вы не столкнулись с этой проблемой.

В противном случае, возможно, опубликуйте весь код простого мидлета, в котором вы используете этот код, и сообщите нам, на каких телефонах вы его пробовали.

Вы также можете использовать ведение журнала (файл или стандартный вывод), чтобы убедиться, что ваш метод загрузки действительно работает во второй раз (или выяснить, почему он не работает)

0 голосов
/ 06 февраля 2011

У меня есть несколько комментариев к коду. Я бы вызвал getResponseCode сразу после закрытия потока вывода и проверил код ответа http, прежде чем открывать поток ввода. Что еще более важно, я бы переместил все закрытия в блок finally. Прямо сейчас, если у вас есть исключение в коде, вы можете оставить экземпляр HttpConnection открытым, что может помешать последующим попыткам подключения.

0 голосов
/ 06 февраля 2009

Для меня этот код не является проблемой. Создал быстрый тестовый мидлет и все заработало на эмуляторе и SonyEricsson W960.

Моя тестовая форма:

class TestForm extends Form implements CommandListener, Runnable {
  private final Command exit = new Command("Exit", Command.EXIT, 0);
  private final Command run = new Command("Run", Command.OK, 0);
  private int testRunCount;

  public TestForm() {
    super("Test");
    addCommand(exit);
    addCommand(run);
    setCommandListener(this);
  }

  public void commandAction(final Command cmd, final Displayable d) {
    if (cmd == exit) {
      notifyDestroyed();
    } else if (cmd == run) {
      final Thread t = new Thread(this);
      t.start();
    }
  }

  public void run() {
    testRunCount++;
    append("Test run " + testRunCount + "\n");
    final String result = upload("StackOverflow testrun " + testRunCount);
    append("Result > " + result + "\n");
  }
}

КСТАТИ:

В любое другое время даже не будет запрашиваться разрешение на использование сети

Нет необходимости просить каждый раз. На телефонах / эмуляторах обычно разрешение запрашивается только один раз за запуск приложения.

Убедитесь, что этот метод даже вызывается после первоначального вызова:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...