2015-01-27 3 views
16

हाय मैं वॉली अनुरोधों को मॉड्यूलर करना चाहता हूं इसलिए मैं वॉली अनुरोधों के साथ गतिविधि प्रस्तुति कोड को मिश्रित नहीं करता हूं। मैंने देखा सभी नमूने, वॉली अनुरोध रखा जा रहा है - उदाहरण के लिए - एक गतिविधि बटन से ऑनक्लिक घटना पर।एंड्रॉइड वॉली - किसी अन्य वर्ग में अनुरोधों को अलग कैसे करें

// prepare the Request 
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null, 
    new Response.Listener<JSONObject>() 
    { 
     @Override 
     public void onResponse(JSONObject response) { 
         // display response  
      Log.d("Response", response.toString()); 
     } 
    }, 
    new Response.ErrorListener() 
    { 
     @Override 
     public void onErrorResponse(VolleyError error) {    
      Log.d("Error.Response", response); 
     } 
    } 
); 

// add it to the RequestQueue 
queue.add(getRequest); 

मेरे यहाँ बात कैसे अन्य वर्ग और सिर्फ उदाहरण वर्ग के लिए यह सब अनुरोध कोड प्राप्त और makeRequest कॉल करने के लिए है:

मैं इस कोड (diff स्रोत से लिया गया) मतलब है। मैंने पहले से ही यह कोशिश की लेकिन यह विफल हो गया। मैं अगर यह प्रसंग के साथ संबंधित कुछ पता नहीं है, लेकिन यह विफल रहता है ...

मैं ऐसा किया:

public void onClick(View v) { 
    try{ 

     Utils varRequest = new Utils(getApplicationContext()); 
     String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="; 

     varRequest.makeRequest(url); 
     mitexto.setText(varRequest.miError); 
    } 
    catch(Exception excepcion) { 
     System.out.println(excepcion.toString()); 

     } 

    } 

... और Utils वर्ग है:

public class Utils { 
    public Context contexto; 
    public String miError; 
    private RequestQueue queue ; 

    public Utils (Context contextoInstancia){ 
     contexto = contextoInstancia; 
     queue = Volley.newRequestQueue(contexto); 
    } 

    public void makeRequest(String url){ 

     JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       // TODO Auto-generated method stub 
       miError="Response => "+response.toString(); 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       // TODO Auto-generated method stub 
       miError="Response => "+error.networkResponse.toString(); 
      } 
     }); 

     queue.add(jsObjRequest); 
    } 
} 

कर सकते हैं कोई मुझे बताता है कि मैं क्या गलत कर रहा हूं, या कोड को कैसे व्यवस्थित करना है?

अग्रिम धन्यवाद।

+0

Async async ... mitexto.setText (varRequest.miError) है; ऑनस्पॉन्स या ऑनररस्पॉन्स में कॉल किया जाना चाहिए ... या क्लास जिस पर ऑनक्लिक है, उसे प्रतिक्रिया देना चाहिए। लिस्टनर ... – Selvin

+1

हेहे, इसलिए इसके बजाय 'Response.Listener ' उसे 'कॉलबैक ' का उपयोग करना चाहिए? एक अंतर कहां है? – Selvin

+2

मुझे लगता है कि रोहित पाटिल का जवाब http://stackoverflow.com/questions/35628142/how-to-make-separate-class-for-volley-library-and-call-all-method-of-volley-from है एक आप चाहते हैं। – SajithK

उत्तर

47
सामान्य रूप में

यह सामान की इस तरह अलग करने के अच्छी आदत है, तो आप सही रास्ते पर हैं, एक singelton वर्ग है कि आपके अनुरोधों को प्रबंधित बनाने पर विचार - यह एक बहुत ही सामान्य टेम्पलेट है, लेकिन मिलना चाहिए अपने संरचना के लिए जा रहा है: जब आप आवेदन कर रहे हैं

एक सिंगलटन वर्ग है, जो आप instatiate बनाने की बात आती है:

:

public class NetworkManager 
{ 
    private static final String TAG = "NetworkManager"; 
    private static NetworkManager instance = null; 

    private static final String prefixURL = "http://some/url/prefix/"; 

    //for Volley API 
    public RequestQueue requestQueue; 

    private NetworkManager(Context context) 
    { 
     requestQueue = Volley.newRequestQueue(context.getApplicationContext()); 
     //other stuf if you need 
    } 

    public static synchronized NetworkManager getInstance(Context context) 
    { 
     if (null == instance) 
      instance = new NetworkManager(context); 
     return instance; 
    } 

    //this is so you don't need to pass context each time 
    public static synchronized NetworkManager getInstance() 
    { 
     if (null == instance) 
     { 
      throw new IllegalStateException(NetworkManager.class.getSimpleName() + 
        " is not initialized, call getInstance(...) first"); 
     } 
     return instance; 
    } 

    public void somePostRequestReturningString(Object param1, final SomeCustomListener<String> listener) 
    { 

     String url = prefixURL + "this/request/suffix"; 

     Map<String, Object> jsonParams = new HashMap<>(); 
     jsonParams.put("param1", param1); 

     JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(jsonParams), 
       new Response.Listener<JSONObject>() 
       { 
        @Override 
        public void onResponse(JSONObject response) 
        { 
         Log.d(TAG + ": ", "somePostRequest Response : " + response.toString()); 
         if(null != response.toString()) 
          listener.getResult(response.toString()); 
        } 
       }, 
       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) 
        { 
         if (null != error.networkResponse) 
         { 
          Log.d(TAG + ": ", "Error Response code: " + error.networkResponse.statusCode); 
          listener.getResult(false); 
         } 
        } 
       }); 

     requestQueue.add(request); 
    } 
} 

जब आपके आवेदन आता है

public class MyApplication extends Application 
{ 
    //... 

    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
     NetworkManager.getInstance(this); 
    } 

//... 

} 

अपने कॉलबैक के लिए एक सरल श्रोता इंटरफेस (अलग फ़ाइल अच्छा करना होगा):

public interface SomeCustomListener<T> 
{ 
    public void getResult(T object); 
} 

और अंत में, जहां भी आप चाहते से, संदर्भ वहाँ में पहले से ही है, बस फोन:

public class BlaBla 
{ 
    //..... 

     public void someMethod() 
     { 
      NetworkManager.getInstance().somePostRequestReturningString(someObject, new SomeCustomListener<String>() 
      { 
       @Override 
       public void getResult(String result) 
       { 
        if (!result.isEmpty()) 
        { 
        //do what you need with the result... 
        } 
       } 
      }); 
     } 
} 

आप जो भी प्राप्त करने की आवश्यकता है उसके आधार पर श्रोता के साथ किसी ऑब्जेक्ट का उपयोग कर सकते हैं, यह कुछ मामूली संशोधन के साथ जीईटी अनुरोधों के लिए भी काम करता है, (this SO thread for more about GET देखें) और आप इसे हर जगह (ऑनक्लिक, आदि) से कॉल कर सकते हैं, बस याद रखें उन्हें एम के बीच मैच करने की जरूरत है ethods।

आशा है कि इससे मदद मिलेगी और बहुत देर हो चुकी नहीं है!

+0

'customlistener' कैसे बनाया गया है? – Sauron

+0

यह एक मूल जावा इंटरफ़ेस है जो आपको किसी ऑब्जेक्ट को स्थानांतरित करने में मदद करता है, इसे एक अलग फ़ाइल में बना देता है (आप इसे यहां से पेस्ट कर सकते हैं, वास्तव में इसमें सब कुछ है, शायद नाम बदलना चाहें), इसे आयात करें, और जब आप वांछित अनुरोध विधि को कॉल करते समय इसे एक अज्ञात ऑब्जेक्ट के रूप में घोषित करें (इंटरफ़ेस क्लास को 'नया कस्टम लिस्टनर ...' के साथ पास कर दें), जो कुछ आपने करना है उसे ओवरराइड करना है और काम जारी रखने के लिए इसका रिटर्न वैल्यू का उपयोग करना है। – TommySM

+0

@TommySM मैं उपरोक्त कोड का उपयोग कर प्रतिक्रिया शीर्षलेख कैसे प्राप्त कर सकता हूं? – user3197818

2

मैं इसके लिए एक सरल समाधान का उपयोग करता हूं। श्रोताओं को बनाएं (चूंकि वे इंटरफ़ेस हैं, इसलिए उन्हें तुरंत चालू नहीं किया जा सकता है लेकिन उन्हें इंटरफ़ेस को लागू करने वाले अज्ञात वर्गों के रूप में तत्काल किया जा सकता है) गतिविधि या खंड के अंदर। अनुरोधों के पैरामीटर के रूप में इन उदाहरणों को पास करें। (स्ट्रिंगरक्वेट, जेसनऑब्जेक्ट रिवेस्ट, या इमेज रिक्वेस्ट)।

public class MainActivity extends Activity { 

private static final String URI_WEATHER = "http://marsweather.ingenology.com/v1/latest/"; 

private Listener<JSONObject> listenerResponse = new Listener<JSONObject>() { 

    @Override 
    public void onResponse(JSONObject response) { 
     Toast.makeText(MainActivity.this, "Resonse " + response.toString(), Toast.LENGTH_LONG).show(); 
    } 
}; 

private ErrorListener listenerError = new ErrorListener() { 

    @Override 
    public void onErrorResponse(VolleyError error) { 
     Toast.makeText(MainActivity.this, "Error " + error, Toast.LENGTH_LONG).show(); 

    } 
}; 

}

इसके बाद, एक वर्ग अनुरोध है कि बना सकते हैं और इस वर्ग के अनुरोध विधि को यह श्रोताओं गुजरती हैं, इतना ही है। मैं इस भाग की व्याख्या नहीं करता हूं यह किसी भी ट्यूटोरियल में अनुरोध ऑब्जेक्ट बनाने जैसा ही है। लेकिन आप इस वर्ग को अपनी इच्छानुसार अनुकूलित कर सकते हैं। आप प्राथमिकता की जांच करने के लिए सिंगलटन RequestQueue बना सकते हैं, या पैरामीटर के रूप में इस विधियों के लिए बॉडी http बॉडी पैरामीटर सेट कर सकते हैं।

public class NetworkManagerWeather { 

public static void getWeatherData(int method, Context context, String url, 
     Listener<JSONObject> listenerResponse, ErrorListener listenerError) { 
    JsonObjectRequest requestWeather = new JsonObjectRequest(Method.GET, url, null, listenerResponse, 
      listenerError); 
    Volley.newRequestQueue(context).add(requestWeather); 
} 

}

अंत में instatnce के लिए MainActivity से इस पद्धति का आह्वान

NetworkManagerWeather.getWeatherData(Method.GET, this, URI_WEATHER, listenerResponse, listenerError); 
संबंधित मुद्दे