2015-10-29 13 views
7

से मैं ओकेएचटीटीपी लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। सर्वर पर कॉल करते समय और एक सफल प्रतिक्रिया वापस प्राप्त करते समय। मुझे यूआई अपडेट करने की जरूरत है।ओकेएचटीटीपी अपडेट यूआई कॉलबैक

enqueue() का उपयोग करके Async कॉल करते समय यह कैसे किया जा सकता है?

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

आप निम्न नमूना कोड का उल्लेख कर सकते, उम्मीद है कि इस मदद करता है! ,

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 
       } 

      }); 
     } 
    } 
}); 
+1

हैंडलर का उपयोग कर के लिए अच्छा उदाहरण – thangdc94

5

इस प्रयास करें:

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

अपने कोड यूआई अद्यतन नहीं है, तो मैं तुम्हें धागा निर्दिष्ट करने के लिए, सुझाव है के बाद से यूआई अपनी ही धागे पर है मैं आपको सुझाव दूंगा कि आप अपना पूरा कोड रननेबल के अंदर न रखें।

एक साधारण उदाहरण:

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 
    } 

} 
0

एक साफ कोड होने की खातिर:

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() 
        } 
       }); 
      } 
     }); 
    } 
} 
संबंधित मुद्दे