android - অ্যান্ড্রয়েড ভলি-অন্য শ্রেণিতে কীভাবে অনুরোধগুলি বিচ্ছিন্ন করা যায়




android-volley (2)

হাই, আমি ভলির অনুরোধগুলিকে মডুলারি করতে চাই যাতে আমি ভলির অনুরোধগুলির সাথে ক্রিয়াকলাপের উপস্থাপনা কোডটি মিশ্রিত না করি। সমস্ত নমুনা যা আমি দেখেছি, ভলির অনুরোধটি একটি ক্রিয়াকলাপ বোতাম থেকে অনক্লিক ইভেন্টে-উদাহরণস্বরূপ স্থাপন করা হচ্ছে।

আমি এই কোডটি বোঝাতে চাইছি (ভিন্ন উত্স থেকে নেওয়া):

// 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);

এখানে আমার বক্তব্যটি কীভাবে এই সমস্ত অনুরোধ কোডটি অন্য কোনও ক্লাসে পাবেন এবং কেবল ক্লাসের উদাহরণ দিন এবং মেকআরকেস্টকে কল করুন। আমি ইতিমধ্যে এটি চেষ্টা করেছিলাম তবে এটি ব্যর্থ হয়। কনটেক্সটের সাথে এটি সম্পর্কিত কিছু ছিল কিনা তা আমি জানি না তবে এটি ব্যর্থ হয় ...

আমি এটা করেছি:

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());

        }

    }

... এবং ইউটিলেস ক্লাসটি হ'ল:

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);
    }
}   

কেউ আমাকে বলতে পারে যে আমি কী ভুল করছি, বা কোডটি কীভাবে গঠন করবেন?

আগাম ধন্যবাদ.


আমি এই জন্য একটি সহজ সমাধান ব্যবহার। শ্রোতা তৈরি করুন (যেহেতু তারা ইন্টারফেস তাই এগুলি সরাসরি ইনস্ট্যান্ট করা যায় না তবে তাদের ক্রিয়াকলাপ বা খণ্ডের ভিতরে একটি বেনাম শ্রেণি হিসাবে ইনস্ট্যান্ট করা যেতে পারে)। অনুরোধগুলিতে প্যারামিটার হিসাবে এই দৃষ্টান্তগুলি পাস করুন (

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 তৈরি করতে পারেন, বা এই পদ্ধতিতে প্যারামিটার হিসাবে বডি এইচটি বডি প্যারামিটার সেট করতে পারেন।

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);
}

}

অবশেষে তাত্ক্ষণিকতার জন্য মেইনএ্যাকটিভিটি থেকে এই পদ্ধতিটি প্রার্থনা করুন

NetworkManagerWeather.getWeatherData(Method.GET, this, URI_WEATHER, listenerResponse, listenerError);

সাধারণভাবে এই ধরণের জিনিসগুলি পৃথক করা ভাল অনুশীলন, সুতরাং আপনি সঠিক পথে রয়েছেন, আপনার অনুরোধগুলি পরিচালনা করে এমন সিনগেলটন ক্লাস তৈরি করার বিষয়টি বিবেচনা করুন - এটি খুব সাধারণ টেম্পলেট , তবে আপনার কাঠামোটি চালু হওয়া উচিত:

একটি সিঙ্গলটন ক্লাস তৈরি করুন, যা আপনি আবেদন করার সময় তাড়িত করবেন:

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...
                    }
                }
            });
        }
}

আপনি কী গ্রহণ করতে হবে তার উপর নির্ভর করে আপনি শ্রোতার সাথে যে কোনও বস্তু ব্যবহার করতে পারেন, এটি কিছুটা সংশোধন করে জিইটি অনুরোধগুলির জন্যও কাজ করে ( জিইটি সম্পর্কে আরও এই এস থ্রেডটি দেখুন ) এবং আপনি যে কোনও জায়গা থেকে (অনক্লিকস ইত্যাদি) কল করতে পারেন ), কেবল মনে রাখবেন তাদের পদ্ধতিগুলির মধ্যে মিল থাকা দরকার।

আশা করি এটি সাহায্য করে এবং খুব দেরী না!





android-volley