Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
|
android_threads [2022/10/10 09:28] enrique_mieza_sanchez [Conceptes previs] |
android_threads [2025/10/14 18:53] (actual) enric_mieza_sanchez [Android i WebSockets] |
||
|---|---|---|---|
| Línia 1: | Línia 1: | ||
| ====== Threads en Android ====== | ====== Threads en Android ====== | ||
| - | Aclarirem certs conceptes de // | + | Aclarirem certs conceptes de // |
| + | |||
| + | {{ android: | ||
| Referències: | Referències: | ||
| * [[Android]] | * [[Android]] | ||
| - | * [[Android | + | * [[Android |
| * [[Android ListView]] | * [[Android ListView]] | ||
| - | {{tag> #Dam #DamMp08 # | + | {{tag> #Dam #DamMp08 # |
| ===== Conceptes previs ===== | ===== Conceptes previs ===== | ||
| Línia 39: | Línia 41: | ||
| <file java> | <file java> | ||
| ExecutorService executor = Executors.newSingleThreadExecutor(); | ExecutorService executor = Executors.newSingleThreadExecutor(); | ||
| - | Handler handler = new Handler(Looper.getMainLooper()); | ||
| executor.execute(new Runnable() { | executor.execute(new Runnable() { | ||
| Línia 45: | Línia 46: | ||
| public void run() { | public void run() { | ||
| - | //Background work here | + | // Tasques en background (xarxa) |
| + | Handler handler = new Handler(Looper.getMainLooper()); | ||
| handler.post(new Runnable() { | handler.post(new Runnable() { | ||
| @Override | @Override | ||
| public void run() { | public void run() { | ||
| - | | + | |
| + | | ||
| + | | ||
| } | } | ||
| }); | }); | ||
| Línia 84: | Línia 88: | ||
| Teniu [[https:// | Teniu [[https:// | ||
| + | \\ | ||
| + | |||
| + | ===== Threads de comunicació ===== | ||
| + | |||
| + | Una aplicació típica és la utilització de //threads// per a comunicació. Tal i com hem dit, no podem executar funcions que bloqueginen el mainUIthread d' | ||
| + | |||
| + | Posem aquest codi d'una crida HTTP en una funció '' | ||
| + | |||
| + | Si l' | ||
| + | |||
| + | <file java MainActivity.java> | ||
| + | String error = ""; | ||
| + | private String getDataFromUrl(String demoIdUrl) { | ||
| + | |||
| + | String result = null; | ||
| + | int resCode; | ||
| + | InputStream in; | ||
| + | try { | ||
| + | URL url = new URL(demoIdUrl); | ||
| + | URLConnection urlConn = url.openConnection(); | ||
| + | |||
| + | HttpsURLConnection httpsConn = (HttpsURLConnection) urlConn; | ||
| + | httpsConn.setAllowUserInteraction(false); | ||
| + | httpsConn.setInstanceFollowRedirects(true); | ||
| + | httpsConn.setRequestMethod(" | ||
| + | httpsConn.connect(); | ||
| + | resCode = httpsConn.getResponseCode(); | ||
| + | |||
| + | if (resCode == HttpURLConnection.HTTP_OK) { | ||
| + | in = httpsConn.getInputStream(); | ||
| + | |||
| + | BufferedReader reader = new BufferedReader(new InputStreamReader( | ||
| + | in, " | ||
| + | StringBuilder sb = new StringBuilder(); | ||
| + | String line; | ||
| + | while ((line = reader.readLine()) != null) { | ||
| + | sb.append(line).append(" | ||
| + | } | ||
| + | in.close(); | ||
| + | result = sb.toString(); | ||
| + | } else { | ||
| + | error += resCode; | ||
| + | } | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | return result; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Per poder-se connectar a internet, cal [[https:// | ||
| + | |||
| + | <file xml AndroidManifest.xml> | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ==== APIs i JSON ==== | ||
| + | Les crides a APIs externes ens retornaran objectes JSON que cal descodificar. Per exemple, pots provar '' | ||
| + | $ curl https:// | ||
| + | {" | ||
| + | |||
| + | Es recomana aquest [[https:// | ||
| + | |||
| + | <WRAP important> | ||
| + | Ull, perquè si el server de **myip.com** rep moltes peticions seguides **acaba per bloquejar-se ja que es pensa que som atacants**. | ||
| + | |||
| + | Si veieu que amb el CURL no funciona, cerqueu una altra API. Cerqueu alguna que us agradi d' | ||
| + | $ curl https:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Exercicis ===== | ||
| + | |||
| + | <WRAP todo> | ||
| + | Llençar comunicacions des d'un //thread// alternatiu: | ||
| + | - Crea un nou projecte [[Android]] amb un botó. | ||
| + | - Afegeix la funció '' | ||
| + | - Comprova que ens salta l' | ||
| + | - Afegeix el codi amb '' | ||
| + | - No oblidis activar el permís Android per a accés a Internet o obtindràs una altra excepció. | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP todo> | ||
| + | Actualitzar la GUI: | ||
| + | - Afegeix un '' | ||
| + | - Quan carreguem dades d' | ||
| + | |||
| + | Anem a posar alguna acció gràfica que ens obligui a utilitzar el '' | ||
| + | |||
| + | Farem servir una '' | ||
| + | - Afegeix la '' | ||
| + | - Descarrega una imatge d' | ||
| + | String urldisplay = " | ||
| + | Bitmap bitmap; | ||
| + | try { | ||
| + | InputStream in = new java.net.URL(urldisplay).openStream(); | ||
| + | bitmap = BitmapFactory.decodeStream(in); | ||
| + | } catch (Exception e) { | ||
| + | Log.e(" | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | </ | ||
| + | - Mostra la imatge al '' | ||
| + | - Utilitza el '' | ||
| + | |||
| + | Si et queda temps, crida la API randomfox (explicada mes amunt) i obtingues una imatge diferent cada cop, i mostra-la al '' | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | Per si et resulta avorrit, mes feina (exercici optatiu): | ||
| + | |||
| + | <WRAP todo> | ||
| + | Anem a provar amb una GUI més ambiciosa: una '' | ||
| + | - Afegeix una [[Android ListView]] al //layout//. | ||
| + | * Pots provar amb una simple '' | ||
| + | - Afegeix //items// al model quan premem el botó. | ||
| + | - Comprova que al refrescar el GUI des del //thread// de comunicacions amb<code java> | ||
| + | adapter.notifyDataSetChanged(); | ||
| + | </ | ||
| + | - Posa el refresc del GUI dins el '' | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ====== Android i WebSockets ====== | ||
| + | |||
| + | Si voleu emprar Websockets mireu l' | ||