2015-10-29 8 views
7

Sto tentando di utilizzare la libreria OkHTTP. Quando si effettua una chiamata al server e si ottiene una risposta di successo. ho bisogno di aggiornare l'interfaccia utente.OkHTTP UI aggiornamento da richiamata accodamento

Come è possibile eseguire questa operazione quando si esegue una chiamata asincrona utilizzando l'enqueue()?

client.newCall(request).enqueue(new Callback() { 

    @Override 
    public void onFailure(Request request, IOException e) { 

    } 

    @Override 
    public void onResponse(Response response) throws IOException { 

     if (response.isSuccessful()) { 

      // NEED TO UPDATE UI HERE 

     } 
    } 
}); 

risposta

7

È possibile fare riferimento al seguente codice di esempio, spero che questo aiuta!

public class MainActivity extends AppCompatActivity { 
    private static final String LOG_TAG = "OkHttp"; 
    private TextView mTextView; 
    private Handler mHandler; 
    private String mMessage; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mTextView = (TextView) findViewById(R.id.textView); 
     mHandler = new Handler(Looper.getMainLooper()); 
     OkHttpClient client = new OkHttpClient(); 
     // GET request 
     Request request = new Request.Builder() 
       .url("http://...") 
       .build(); 
     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Request request, IOException e) { 
       mMessage = e.toString(); 
       Log.e(LOG_TAG, mMessage); // no need inside run() 
       mHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         mTextView.setText(mMessage); // must be inside run() 
        } 
       }); 
      } 

      @Override 
      public void onResponse(Response response) throws IOException { 
       mMessage = response.toString(); 
       Log.i(LOG_TAG, mMessage); // no need inside run() 
       mHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         mTextView.setText(mMessage); // must be inside run() 
        } 
       }); 
      } 
     }); 
    } 
} 
+1

Bell'esempio per l'utilizzo del gestore – thangdc94

5

Prova questo:

Handler mainHandler = new Handler(Looper.getMainLooper()); 
mainHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // code to interact with UI 
    } 
}); 
5

Se il codice non aggiorna l'interfaccia utente, vorrei suggerire di specificare il filo, in quanto interfaccia utente è sul suo thread:

client.newCall(request).enqueue(new Callback() { 

    @Override 
    public void onFailure(Request request, IOException e) { 

    } 

    @Override 
    public void onResponse(Response response) throws IOException { 

     if (response.isSuccessful()) { 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        //TODO: update your UI 
       } 

      }); 
     } 
    } 
}); 
0

Per il gusto di avere un codice pulito, Ti suggerirei di non mettere l'intero codice all'interno della eseguibile.

Un semplice esempio:

public class MainActivity extends AppCompatActivity { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     OkHttpClient client = new OkHttpClient(); 
     Request request = new Request.Builder() 
      .url("http://...").build(); 

     client.newCall(request).enqueue(new Callback() { 


      @Override 
      public void onFailure(Request request, IOException e) { 
       e.printStackTrace(); 
      } 


      @Override 
      public void onResponse(Response response) throws IOException { 

       final String body = response.body().string(); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         updateUI(body); 
        } 
       }); 

      } 


     }); 
    } 

    private void updateUI(responseBody){ 
     //TODO: update your UI 
    } 

}