J2ME - HttpConnection - deadlock - networking

0

podczas uruchomionego midletu jezeli chce polaczyc sie z internetem w celu pobrania danych z pliku, po zadanym pytaniu jakie widac na screenie:
http://kolos.math.uni.lodz.pl/~bart/screen2.jpg
klikajac YES, midlet nie przechodzi dalej tylko konsola wyrzuca w tle warning:

Warning: To avoid potential deadlock, operations that may block, such as
networking, should be performed in a different thread than the
commandAction() handler.

kod programu zwiazanego z HttpConnection

/*
 * live.java
 *
 * Created on 12 styczeń 2008, 02:18
 */

package futbol24; 

import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.io.*; // do laczenia sie z serwerem
import javax.microedition.midlet.*;
import java.io.*;

/**
 *
 * @author  bart
 * @version
 */
public class DataTransfer {
    
    private Form tForm;
    
    public String httpAddress = ""; // url where the file is set
    String st = new String();
    
    String[] getLine(InputStream is) {
        String[] line = new String[5];   
        line[0] = line[1] = line[2] = line[3] = line[4] = "";
        
        int i = 0;
        
        try {
            byte b[] = new byte[1];
            int end;
            end = is.read(b);
            
            if( end != -1 ) {
                while ((new String(b).equals("^") == false) && end != -1) {
                    
                    
                    if (new String(b).equals("@")) {
                        i = 1;
                        end = is.read(b);
                        continue;
                    } else if (new String(b).equals("#")) {
                        i = 2;
                        end = is.read(b);
                        continue;
                    } else if (new String(b).equals("$")) {
                        i = 3;
                        end = is.read(b);
                        continue;
                    } else if (new String(b).equals("%")) {
                        i = 4;
                        end = is.read(b);
                        continue;
                    }
                    
                    line[i] += new String(b);
                    end = is.read(b);
                    
                }
                
            } 
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        return line;
    }
    
    public String getText() throws IOException {

        if (tForm == null) {
            
            HttpConnection sc = (HttpConnection)Connector.open("http://kolos.math.uni.lodz.pl/~bart/tekstowy.txt");
            InputStream is = sc.openInputStream();
            
            boolean flag = true;
            String[] line = new String[5];
            int a = 0;
            
            while(flag) {
                line = this.getLine(is);
                
                if(line[1].equals("end")) {
                    flag = false;
                    break;
                } else {
                     this.st += line[0];
                }
            }
            
            is.close();
            sc.close();
        }
        
        return st;
    }
    
}

oraz wywolanie w innej klasie, jedna z metod:

    public TextField getTextField1() {
        if (textField1 == null) {
            // write pre-init user code here
            textField1 = new TextField("textField1", null, 32, TextField.ANY);
            this.dt.httpAddress = "http://kolos.math.uni.lodz.pl/~bart/tekstowy.txt";
            String tex = new String();
            
            try {
                tex = this.dt.getText();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
            textField1.setString(tex);
            // write post-init user code here
        }
        return textField1;
    }
0

W Wireless Toolkit jest już gotowa podobna aplikacja poszukaj w jej kodzie źródłowym. Może coś ciekawego się pojawi ;)

0

a nie wystarczy przerobic klasy DataTransfer na wątek ? jak myslicie?

0

Warning: To avoid potential deadlock, operations that may block, such as
networking, should be performed in a different thread than the
commandAction() handler.

Komunikat powinien wyjasnic wszystko. Ze wzgledu na to, ze niektore operacje, np. networking lub streaming (tj. mechanizmy bazujace na strumieniach I/O) moga powodowac blokowanie aplikacji (czas oczekiwania na otwarcie/odczyt/zapis/zamkniecie strumienia), w J2ME zalecane jest ich w osobnych watkach. Wtedy, mimo iz operacja moze sie przeciagnac (np. nawiazywanie zdalnego polaczenia przy slabym zasiegu), uzytkownik nadal ma kontrole nad aplikacja. BTW: stosowane jest to nie tylko przy programowaniu aplikacji J2ME.
Zaleznie od stopnia zlozonosci aplikacji, nie jest zla praktyka stworzenie sobie osobnego mechanizmu konektora (klasa), ktory bedzie wykonywal odpowiednie operacje sieciowe.
Pozdr.

0

dzieki poszedlem za Twoja rada i dziala

0

O, nie wiedziałem, że w aplikacjach na komórki można tworzyć wątki!

Takie pytanko na marginesie (wiem, że to nie powinno być w tym temacie, ale nie chce zakładać nowego): jaką mniej więcej mają "pamięć operacyjną" telefony komórkowe. Chodzi mi o tę, którą może zagospodarować sobie program w Javie. Bo raz czytam, że koło 64 KB, czyli tyle, ile się spodziewam, a raz, że to może być nawet 16 MB (mój stary komputer miał jeszcze rok temu tylko 64 MB!).

0

Wszystko zalezy od od producenta urzadzenia. Konfiguracja CLDC zaklada, ze minimum potrzebnej pamieci to: 32KB dla KVM (Kilobyte Virtual Machine), 128KB dla aplikacji i 8KB pamieci trwalej (RecordStore). Wczesniej, profil MIDP 1.0 mial rowniez ograniczenie rozmiaru pliku MIDlet'u (.jar) do 64KB. Z chwila wprowadzenia MIDP 2.0 i wbudowanych pamieci SD/MMC/Flash, ograniczenie rozmiaru pliku zostalo zniesione. Mysle, ze mozna zalozyc, iz na chwile obecna telefony maja >1MB pamieci.

PS. J2ME udostepnia metody umozliwiajace sprawdzenie stanu pamieci.
Pozdr.

0

Dzięki za informacje. Szperając w internecie też przeczytałem o tych kartach. Można rozszerzyć pamięć operacyjną nawet do wielkości rzędu 512 MB! (Tylko czy ta pamięć operacyjna na kartach jest równie szybka jak ta w telefonie?)

A skoro jesteśmy przy pamięci operacyjnej, to jakie są średnie szybkości przetwarzania danych przez komórki? Czy można je wyrażać w Hz (czy to jest podobnie jak z procesorem?)?
Patrzyłem do Internetu. Ale nie chce się wierzyć, że to może być 160 Mhz (http://www.intel.com/cd/corporate/pressroom/emea/pol/archive/2003/138760.htm).

Skoro telefony mają ok. 1 MB pamięci, to jakby na to nie patrząc, można napisać "Settlers 2" na komórki. Wersja na komputer zajmuje do 11 MB. Jeśli więc się trochę zmniejszy mapy, to czemu nie. :P

0
krzysiumed napisał(a)

Dzięki za informacje. Szperając w internecie też przeczytałem o tych kartach. Można rozszerzyć pamięć operacyjną nawet do wielkości rzędu 512 MB! (Tylko czy ta pamięć operacyjna na kartach jest równie szybka jak ta w telefonie?)

A skoro jesteśmy przy pamięci operacyjnej, to jakie są średnie szybkości przetwarzania danych przez komórki? Czy można je wyrażać w Hz (czy to jest podobnie jak z procesorem?)?
Patrzyłem do Internetu. Ale nie chce się wierzyć, że to może być 160 Mhz (http://www.intel.com/cd/corporate/pressroom/emea/pol/archive/2003/138760.htm).

Skoro telefony mają ok. 1 MB pamięci, to jakby na to nie patrząc, można napisać "Settlers 2" na komórki. Wersja na komputer zajmuje do 11 MB. Jeśli więc się trochę zmniejszy mapy, to czemu nie. :P

pamieci flashowe sa wolniejsze niz wewnetrzna, dostepna w telefonie (z doswiadczenia, aplikacje na N95 instalowane w pamieci telefonu chodza szybciej, instalowane na karcie flash potrafia przycinac i laduja sie strasznie dlugo).

1 użytkowników online, w tym zalogowanych: 0, gości: 1