2015-10-29 12 views
7

OkHTTPライブラリを使用しようとしています。サーバーに電話をかけて成功した応答を返すとき。私はUIを更新する必要があります。OkqueTPエンキューコールバックからUIを更新する

これは、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 

     } 
    } 
}); 

答えて

7

あなたは、次のサンプルコードを参照することができ、このことができます願っています!

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

ニース例 – thangdc94

5

これを試してみてください:

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

あなたのコードは、UIを更新していない場合はUIが独自のスレッド上にあるため、私は、スレッドの指定をお勧めします:クリーンなコードを有するのために

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

、あなたのコード全体をrunnableの中に入れないことをお勧めします。

簡単な例:ハンドラを使用するための

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 
    } 

} 
関連する問題