2010-08-02 10 views
17

Ho un'applicazione che sta eseguendo richieste HTTP (in particolare chiamando l'API FogBugz) quando l'utente fa clic su determinati pulsanti. Al momento, sto solo creando un servizio all'avvio dell'applicazione, quindi chiamando diversi metodi in quel servizio per completare le richieste. Tuttavia, quando faccio questo, c'è il solito blocco nel thread dell'interfaccia utente. Ho visto AsyncTask, ma non sono sicuro che farà ciò che voglio realizzare. Perché ho bisogno di analizzare immediatamente l'XML che restituisce la richiesta HTTP, ho bisogno di avere un processo che è in grado di restituire questi dati al thread dell'interfaccia utente. ASyncTask sarà in grado di realizzare questo, o c'è un altro modo?Come utilizzare thread separati per eseguire richieste HTTP

public static InputStream makeRequest(String httpRequest) 
    { 
     In a separate thread, run HTTP Request, get back and process, return inputstream 
    } 

Questo metodo è chiamato da molti altri per eseguire HttpRequests. Una volta restituito l'inputstream, gli altri metodi analizzano informazioni specifiche.

risposta

59

Il modo più semplice per farlo sarebbe solo per fare qualcosa di simile

//Body of your click handler 
Thread thread = new Thread(new Runnable(){ 
    @Override 
    public void run(){ 
    //code to do the HTTP request 
    } 
}); 
thread.start(); 

che farà sì che il codice all'interno del metodo run() per eseguire in un nuovo thread di esecuzione. Puoi guardare in un compito asincrono se vuoi, anche se personalmente non l'ho mai usato. Questo è un modo semplice e veloce per fare le cose.

Per quanto riguarda il ritorno delle informazioni, utilizzerei uno Handler object che consente effettivamente di impostare una coda di messaggi per un dato thread e di passarci messaggi che causano l'esecuzione di codice specifico. Il motivo per cui è necessario farlo è perché Android non consente a nessun thread diverso dal thread dell'interfaccia utente di aggiornare l'interfaccia utente effettiva.

Questo risponde alla tua domanda? So che il mio primo passaggio non ha risolto completamente tutti i tuoi problemi.

Modifica In sostanza, quello che fai è definire un oggetto gestore nella tua Activity come

private Handler handler_ = new Handler(){ 
    @Override 
    public void handleMessage(Message msg){ 

    } 

}; 

È inoltre possibile creare statici int costanti che aiutano a raccontare il gestore che cosa fare. In pratica si usano quelli per consentire la trasmissione di diversi tipi di messaggi a un'istanza di un gestore. Se ci sarà solo un messaggio che viene restituito, non devi preoccuparti di questo.

Per esempio

private static final int UPDATE_UI = 1; 

Per inviare un messaggio al gestore si chiama

handler_.sendMessage(Message.obtain(handler_, UPDATE_UI, inputStreamInstance)); 

da parte del conduttore:

private Handler handler_ = new Handler(){ 
    @Override 
public void handleMessage(Message msg){ 
    switch(msg.what){ 
      case UPDATE_UI: 
      InputStream is = (InputStream)msg.obj; 
      //do what you need to with the InputStream 
      break; 
     } 
    } 

}; 

In alternativa, in cui si aggiunge l'inputStreamInstance al Message oggetto, puoi passare qualsiasi oggetto che ti piace se lo volevi analizzare a qualche tipo di oggetto contenitore o qualcosa del genere, potresti farlo anche tu. È sufficiente restituirlo a quell'oggetto dall'interno del gestore.

+0

Grazie per l'aiuto. Sto ancora avendo qualche problema per quanto riguarda l'invio e la ricezione di informazioni dal thread separato. Ho aggiornato la mia domanda per spero di chiarire cosa devo fare. Per quanto riguarda l'oggetto Handler, lo userei nel thread secondario, per passare informazioni, ad esempio il flusso di input? – mbauer14

4

Provare ad usare AsyncTask.Goto questo Link per più:

private class SyncIncoData extends AsyncTask<String, String, String> { 
    ProgressBar pb; 
    ProgressBar pbar; 

    @Override 
    protected String doInBackground(String... urls) { 
     for (int i = 0; i <= 100; i++) { 
      publishProgress(i); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 

     pb = (ProgressBar) findViewById(R.id.progressBarsync4); 
     pb.setVisibility(View.VISIBLE); 

    } 

    @Override 
    protected void onPostExecute(String result) { 

     pb = (ProgressBar) findViewById(R.id.progressBarsync4); 
     pb.setVisibility(View.INVISIBLE); 

    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     pbar = (ProgressBar) findViewById(R.id.progressBarpbar); 
     pbar.setProgress(Integer.parseInt(values[0])); 
     super.onProgressUpdate(values); 
    } 
} 

Scrivi il programma per la richiesta http all'interno doinbackgroud()

Problemi correlati