2015-06-30 8 views
6

यह मेरा कोड है:एंड्रॉइड ओकेएचटीपी का उपयोग कर कॉलबैक से प्रतिक्रिया स्ट्रिंग कैसे प्राप्त करें?

OkHttpClient okHttpClient = new OkHttpClient(); 

    Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build(); 

    Callback callback = new Callback() { 
     @Override 
     public void onFailure(Request request, IOException e) { 

     } 

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

     } 
    }; 

    okHttpClient.newCall(request).enqueue(callback); 

    String responseString; 

उपरोक्त कोड में, मैं() response.body का मूल्य संग्रहीत करना चाहते हैं चर responseString में onResponse() विधि से स्ट्रिंग(), हालांकि मैं यह कर सकते हैं '। इसे एक्सेस नहीं करते हैं।

+1

मैं उलझन में हूं कि आप यहां क्या करने की कोशिश कर रहे हैं। यदि यह कोड किसी स्थानीय फ़ंक्शन में मौजूद है तो एसिंक्रोनस कॉलबैक का उपयोग करने और कॉलिंग फ़ंक्शन में घोषित वैरिएबल को स्टोर करने के लिए यह कितना अच्छा करता है? आप तब तक इसका उपयोग नहीं कर पाएंगे जब तक आप पहले ब्लॉक नहीं करते। आप प्रतिक्रिया को क्लास इंस्टेंस वैरिएबल में स्टोर कर सकते हैं और यह ठीक काम करेगा। संभावना से अधिक हालांकि आप इस बारे में गलत तरीके से जा रहे हैं। –

+0

@ मैटवॉल्फ आप शायद सही हैं, मैं एंड्रॉइड विकास के लिए नया हूं। जो मैं करने की कोशिश कर रहा हूं उसे इस तरह के कुछ डेटा मिलते हैं [link] (https://hacker-news.firebaseio.com/v0/topstories.json), इसे एक चर में सहेजें, इसे पार्स करें और फिर स्क्रीन पर प्रदर्शित करें एक दृश्य का उपयोग कर। एक आवृत्ति चर में डेटा संग्रहीत करना ऐसा करने का सही तरीका होगा या कोई और तरीका है? धन्यवाद। –

+0

मुझे आपकी गतिविधि/खंड लागू होगा कॉलबैक: फिर करें: okHttpClient.newCall (अनुरोध) .enqueue (यह); फिर अपने ऑनस्पॉन्स में इसे पार्स करें और आप परिणाम स्क्रीन पर प्रदर्शित कर सकते हैं। –

उत्तर

4

मुझे लगता है कि आप क्या करना चाहते हैं कुछ इस तरह है करने के लिए है स्वयं का एक उदाहरण (इस) और इस तरह हम वर्ग को वापस कॉल करने के लिए ओकेथथ प्राप्त कर सकते हैं, हम आसानी से एक आंतरिक कक्षा भी कर सकते थे लेकिन इससे हमें कक्षाओं में से # को कम कर दिया जाता है। मैंने एचटीपी कॉल किए जाने पर चित्रित करने के लिए एक बटन क्लिक किया लेकिन यह कुछ और समय हो सकता है, उदाहरण के लिए यह तब हो सकता है जब स्क्रीन पहली बार बनाई गई हो (ऑनक्रेट में)। स्क्रीन रोटेशन के बावजूद सावधान रहें। यह भी मानता है कि कॉलबैक मुख्य धागे पर किया जाता है जो मुझे लगता है कि यह होगा लेकिन मैं सकारात्मक नहीं हूं क्योंकि मैं आपके से अलग तरीके से okttp का उपयोग करता हूं। यदि यह मुख्य धागे पर प्रतिक्रिया पर परिणाम नहीं लौटाता है तो आप runOnUiThread() को कॉल कर सकते हैं और इसे एक रननेबल पास कर सकते हैं जो दृश्यों को अपडेट करने का काम करता है।

+0

क्या आप किसी चीज़ का उदाहरण/लिंक पोस्ट कर सकते हैं उपयोग करेंगे, क्योंकि उपर्युक्त विधि जैसा आपने कहा था, स्क्रीन रोटेशन पर हर बार नेटवर्क कॉल निष्पादित करेगा? –

+0

यह एक एकल या सरल समाधान के बिना एक आम समस्या है। –

+0

https://medium.com/google-developers/making-loading-data-on-android-lifecycle-aware-897e12760832 –

2

यदि आप responseString घोषणा आवृत्ति चर होने के लिए स्थानांतरित करते हैं तो आप अपने Callback की onResponse विधि में अपना मान असाइन करने में सक्षम होंगे।

public class MyClass { 

    private String responseString; 

    // your class implementation 

} 

मैं कोड आप नीचे दिए गए आवश्यक परिवर्तन के साथ पोस्ट को संशोधित किया है:

OkHttpClient okHttpClient = new OkHttpClient(); 

Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build(); 

Callback callback = new Callback() { 
    @Override 
    public void onFailure(Request request, IOException e) { 

    } 

    @Override 
    public void onResponse(Response response) throws IOException { 
     responseString = response.body().string(); 
    } 
}; 

okHttpClient.newCall(request).enqueue(callback); 
+0

दुर्भाग्यवश मैं प्रतिक्रिया के मूल्य को बदल नहीं सकता रेस्पॉन्स के अंदर स्ट्रिंग क्योंकि यह अंतिम –

+0

है, आप गलती के लिए खेद है, बिल्कुल सही हैं। मैंने अपना कोड संशोधित किया है लेकिन यदि यह अब उपयोगी नहीं है तो मैं इसे हटा दूंगा। –

+0

धन्यवाद। यह पता चला है कि कोड काम करता है, हालांकि प्रतिक्रिया के मूल्य के लिए कुछ समय लगता है। –

1

सबसे पहले इस सवाल का जवाब बहुत करीब है, लेकिन आप विधि onResponse में अंतिम चर नहीं सौंप सकते। हम कॉलबैक को लागू करने और उसके बाद जब हम okhttp अनुरोध बनाने के लिए, हम इसे पारित

public class MyActivity extends Activity implements Callback , View.OnClickListener { 


@Override 
public void onCreate(Bundle savedState) { 
    super.onCreate(savedState); 
    findViewById(R.id.DoHttp).setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    if (v.getId(() == R.id.DoHttp) { 

    OkHttpClient okHttpClient = new OkHttpClient(); 

    Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build(); 
    okHttpClient.newCall(request).enqueue(this); 
    } 
} 


@Override 
public void onFailure(Request request, IOException e) { 
    //do something to indicate error 
} 

    @Override 
    public void onResponse(Response response) throws IOException { 
    if (response.isSuccessful()) { 
    parse(response.body().string()); 
    } 
    } 

    private void parse(String response) { 
    //do something with response 
    } 
} 

ऊपर गतिविधि में: वैकल्पिक हल final String[] responseString = new String[1]; टाइप करें और आवंटित responseString[0] = response.body().string();

+0

मेरा कोड बदलने के बाद, https://gist.github.com/taimoor-ahmad/ef9515751294d80d460e मुझे java.lang मिलती है।NullPointerException: println को प्रतिक्रिया के मान का उपयोग करने का प्रयास करते समय एक संदेश की आवश्यकता होती है जब मेरे लॉग –

+0

पर कोडस्ट्रिंग [0] में कोड को अभी तक वापस नहीं कहा गया था, तो आपको कॉलबैक निष्पादन के बाद इसे प्रिंट करना होगा – Tomek

संबंधित मुद्दे

 संबंधित मुद्दे