Cómo devolver un valor de hilo en java?
En android estoy creando el hilo para la conexión del url. Dentro del hilo de rosca almaceno el mensaje de la respuesta en una cadena que sea declarada globalmente. Cuando consigo el método del método devuelve null.
public class Rate_fetch { String total=""; public String rate(String dt) { new Thread(new Runnable(){ public void run(){ try { URL url = new URL(tally_ipaddr+"/prorate.jsp?plist="+sss.toString().trim()); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); BufferedReader r = new BufferedReader(new InputStreamReader(in)); String x = ""; String total = ""; x = r.readLine(); int i=0; while(x.length()>1) { total=total+x.toString().trim(); i++; x = r.readLine(); } } catch(Exception e){ return e.toString(); } } }).start(); return total; }
Cuando llamo al método devuelve null.
- Si cualquier hilo de trabajo puede actualizar la interfaz de usuario en android?
- Espere a que los hilos se completen antes de continuar
- Comunicación multihilo: ¿qué tan bueno es el uso de variables atómicas como AtomicInteger? ¿Por qué no hay AtomicFloat?
- ANR keyDispatchingTimedOut
- Runnable se publica correctamente pero no se ejecuta
Rate_fetch rf=new Rate_fetch(); String amt= rf.rate(prodList);
- ¿Una clase anónima mantiene referencias externas vivas?
- Llamada Hilo principal de hilo secundario en Java / Android
- ¿Cuáles son las consecuencias si intentamos conectar un hilo nativo permanentemente a la DVM (JVM)?
- Java.lang.RuntimeException: Sólo se puede crear un Looper por subproceso
- Cómo esperar a que Android runOnUiThread para ser terminado?
- Accediendo simultáneamente a diferentes miembros del mismo objeto en Java
- diferencia runable androide
- Cómo evitar la señal fatal 6 (SIGABRT) en android
Si realmente quieres usar Thread
solamente, prueba esto
public class Rate_fetch { String total = ""; boolean b = true; public String rate(String dt) { StringBuilder sb = new StringBuilder(); new Thread(new Runnable() { public void run() { try { URL url = new URL(tally_ipaddr + "/prorate.jsp?plist=" + sss.toString().trim()); HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); InputStream in = new BufferedInputStream(urlConnection .getInputStream()); BufferedReader r = new BufferedReader( new InputStreamReader(in)); StringBuilder sb = new StringBuilder(); String s; while (true) { s = r.readLine(); if (s == null || s.length() == 0) break; sb.append(s); } b = true; } catch (Exception e) { b = true; } } }).start(); while (b) { } total = sb.toString(); return sb.toString(); } }
Está obteniendo el valor de result
como nulo porque la rate
método está ejecutando un subproceso para que la return
no esté esperando para finalizar el subproceso.
Puede utilizar una de las siguientes técnicas para resolver el problema
- Manejadores
- Asincrónico Tarea
También puede mirar el enlace para la referencia.
http://mobileorchard.com/android-app-developmentthreading-part-1-handlers/
Te estás perdiendo todo el punto de usar un hilo, porque los usamos para hacer una operación costosa o potencialmente larga en un hilo separado para no bloquear el hilo de la interfaz de usuario. Por lo tanto, no puede iniciar un subproceso y esperar obtener el resultado al instante, como Premsuraj, se devuelve antes de que el subproceso ha terminado.
Como otros sugirieron, una manera más limpia de hacer esto sería usar un AsyncTask, encapsula el proceso en tres etapas principales: OnPreExecute, doInBackground y onPostExecute, los nombres son autoexplicativos, el primero hace cualquier inicialización que pueda necesitar, el segundo En realidad hacer el trabajo asíncrono y el tercero se utiliza para hacer frente al resultado de toda la operación.
Aquí hay un ejemplo rápido, por supuesto, se puede mejorar, pero debe ayudar a entenderlo:
Rate_fetch
Su misma clase pero sin enhebrar:
public class Rate_fetch { public String rate(String dt) { String total=""; try { URL url = new URL(tally_ipaddr+"/prorate.jsp?plist="+sss.toString().trim()); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); BufferedReader r = new BufferedReader(new InputStreamReader(in)); String x = ""; String total = ""; x = r.readLine(); int i=0; while(x.length()>1) { total=total+x.toString().trim(); i++; x = r.readLine(); } } catch(Exception e){ return e.toString(); }; return total; } }
Un ejemplo de actividad:
public class YourActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); GetRate asyncRate = new GetRate(); asyncRate.execute(); // starting the task, can be done wherever you need, for example a Button click event } private class GetRate extends AsyncTask<Void, Integer, String> { @Override protected String doInBackground(Void... params) { Rate_fetch fetch = new Rate_fetch(); string rate = fetch.rate(); return rate; } @Override protected void onPostExecute(String rate) { // Do whatever you need with the string, you can update your UI from here } } }
Espero eso ayude.
Simplemente declare una variable de clase y pase el objeto en su hilo
No puede devolver un valor de un subproceso. Su función Rate_fetch volvería antes de que el subproceso haya comenzado a ejecutarse. Una solución es utilizar AsyncTask y utilizar el valor en su onPostExecute.
Si usted elige usar un hilo separado para ejecutar su lógica está implícito que la ejecución del código dentro de su hilo será asíncrona, por lo que no puede acceder al resultado ignorando inmediatamente la ejecución del hilo asíncrono. Usted debe considerar utilizar algo como http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/FutureTask.html
Eche un vistazo a Thread Local , que le hace llevar un parámetro con el hilo que es su propia variable local.
Posiblemente puede pasar la referencia de principal / actual hilo / clase al hilo. Y el hilo almacenará su resultado en ese objeto referenciado.
A continuación se muestra un ejemplo sencillo.
class CallerTest{ private ResultData result; // any data that you want from thread public void caller() throws Exception{ ThreadClass thread = new ThreadClass(this); thread.start(); //wait for thread to finish thread.join(); //now you have data in >> this.result } public void setResult(ResultData rd){ this.result = rd; } } class ThreadClass extends Thread{ CallerTest cl; public ThreadClass(CallerTest cl){ this.cl = cl; } public void run() { ResultData rd; rd = //do code to retrive result cl.setResult(rd); } }