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.

  Rate_fetch rf=new Rate_fetch(); String amt= rf.rate(prodList); 

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); } } 
  • Cómo pausar / dormir hilo o proceso en Android?
  • ¿Por qué parece que tomar mucho tiempo para que este bloque sincronizado obtenga un bloqueo?
  • Enhebrado en Android
  • ¿Cómo puedo reiniciar un hilo en java / Android desde un botón?
  • Respuesta de respuesta de Okhttp en el hilo principal
  • runOnUiThread no se está ejecutando en AsyncTask
  • ¿Cómo puedo mantener vivo un hilo de conexión? (¿Necesito usar un daemon?)
  • Cómo reiniciar un hilo en Android?
  • Android AsyncTask permanece en estado de ejecución después de completar
  • Android ht stime, utime?
  • Manejadores, MessageQueue, Looper, ¿todos ellos se ejecutan en el hilo de interfaz de usuario?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.