» »

[Android] Thread

[Android] Thread

marjan_h ::

Implementiral sem točno te niti katere kodo dobite na android guide. Vendar ko kličem start(), ne dobim niza teksta. Ali je pravilno da ker se jaz z mobitelom povežem na bluetooth napravo, je mobitel klient, pravtako on čaka v neskončni zanki da mu nekdo nekaj pošlje. Jaz sem preskočil del za programiranje strežnika.

private class ConnectThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final BluetoothDevice mmDevice;
  
        public ConnectThread(BluetoothDevice device) {
 
            BluetoothSocket tmp = null;
            mmDevice = device;
     
            try {
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                e.printStackTrace();
            }
            mmSocket = tmp;
        }
     
        public void run() {
               
            btAdapter.cancelDiscovery();
     
            try {
 
                mmSocket.connect();
            } catch (IOException connectException) {
                connectException.printStackTrace();
 
                try {
                    mmSocket.close();
                } catch (IOException closeException) {
                        closeException.printStackTrace();
                }
                return;
            }
            // connected thread start
            ConnectedThread objekt = new ConnectedThread(mmSocket);
            objekt.start();
        }
     
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
   
   
}


private class ConnectedThread extends Thread {
                
            private final BluetoothSocket mmSocket;
            private final InputStream mmInStream;
          
            public ConnectedThread(BluetoothSocket socket) {
                mmSocket = socket;
                InputStream tmpIn = null;
          
                try {
                    tmpIn = socket.getInputStream();
                    
                } catch (IOException e) {
                        e.printStackTrace();
                }
          
                mmInStream = tmpIn;
            }
          
            public void run() {
                byte[] buffer = new byte[1024];
                int bytes;
                
                while (true) {
                    try {
                        bytes = mmInStream.read(buffer);
                        String str = new String(buffer, "UTF-8");
                        
                        Toast.makeText(getApplicationContext(), str, 0).show();
                    } catch (IOException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
          
            public void cancel() {
                try {
                    mmSocket.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
            }
        }


Upam da sedaj ni preveč kode. Če želite lahko dam logcat, vendar je dolg 10000 vrstic. Ali naj filtriram samo za to aplikacijo? Se pri logcatu izpiše tudi e.printStackTrace()?

FrEaKmAn ::

afaik se printStackTrace ne prikaže, uporabi

try
{
    ...
} 
catch (IOException e) 
{
    Log.e("YOUR_APP_LOG_TAG", "I got an error", e);
}


pa poročaj če kaj dobiš...

ps: filtriraj v logcatu samo po errorju..

Mavrik ::

e.printStackTrace() se jasno pokaže v logcatu kot ERROR level.
The truth is rarely pure and never simple.

Spura ::

Tole je blazno cudno sprogramirano. Pa tudi zasnova, zakaj 2 threada, ce pa program le en connection fura?

marjan_h ::

Dva threada sta zato, ker v official android guide tako piše. Jaz sem se držal teh navodil.

Ugotovil sem da je UUID napačno generiran. Vzel sem enega znanega iz neta in dela.

Sedaj je drugi problem, osredotočite se na kodo:

bytes = mmInStream.read(buffer);
String str = new String(buffer, "UTF-8");


Poskusil sem tudi z ASCII, vendar problem je ker dobim namesto "Hello world", "H@@@€€€€~łłl".

Kaj je problem tukaj? Encoding? Zakaj dela z drugo aplikacijo pravilno tukaj pa ne?

Hvala

Spura ::

Za zacetek bi lahko v string dal dejansko prebrane byte in ne celga bufferja.

marjan_h ::

In kako vem kje se konča prebran byte? Z EOF ali kako?

Mi lahko pokažeš to v treh vrsticah kode, java ima zagotovo kakšno knjižnico zato.

Hvala Spura

Kocka ::

Meni je v oči padlo najprej to, da v threadu kličeš Toast.makeText. Mislim, da se to lahko kliče samo na UI threadu in nikjer drugje. Toast funkcijo je potrebno poklicati preko Handlerja in post funkcije.
Glej primere, kako to rešujejo:
http://stackoverflow.com/questions/4209...
in naprimer:
http://stackoverflow.com/questions/3134...

Spura ::

marjan_h je izjavil:

In kako vem kje se konča prebran byte? Z EOF ali kako?

Mi lahko pokažeš to v treh vrsticah kode, java ima zagotovo kakšno knjižnico zato.

Hvala Spura

bytes = mmInStream.read(buffer);


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Bluetooth aplikacija

Oddelek: Programiranje
51010 (873) marjan_h
»

[Android] Nov tip shranjevanja slike

Oddelek: Programiranje
142082 (1206) urosz
»

Java - problem povezave na FTP

Oddelek: Programiranje
101098 (955) igor0203
»

Java in pošiljanje elektronske pošte!!

Oddelek: Programiranje
51277 (1178) janez_janez
»

Kako pošiljanje datotek v JAVI.

Oddelek: Programiranje
141729 (1600) kopernik

Več podobnih tem