2015-10-29 4 views
7

Ich versuche, OkHTTP-Bibliothek zu verwenden. Wenn Sie den Server anrufen und eine erfolgreiche Antwort erhalten. Ich muss die Benutzeroberfläche aktualisieren.OkHTTP Update UI von Enqueue Callback

Wie kann dies durchgeführt werden, wenn ein Async-Aufruf mit der enqueue() durchgeführt wird?

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 

     } 
    } 
}); 

Antwort

7

Sie auf den folgenden Beispielcode beziehen, hoffe, das hilft!

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

Schönes Beispiel für Handler – thangdc94

5

Try this:

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

Wenn Ihr Code die Benutzeroberfläche nicht aktualisiert, würde ich vorschlagen, dass Sie den Faden geben, da UI auf einem eigenen Thread ist:

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

Aus Gründen einen sauberen Code zu haben, Ich würde vorschlagen, dass Sie Ihren gesamten Code nicht in das ausführbare Programm schreiben.

Ein einfaches Beispiel:

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 
    } 

}