ভলির সময়সীমা স্থির করুন


190

আমি আমার সার্ভারে একটি অনুরোধ করতে অ্যান্ড্রয়েডের জন্য নতুন ভল্লি কাঠামোটি ব্যবহার করি। তবে এটি প্রতিক্রিয়া পাওয়ার আগে সময়সীমা অতিক্রম করে, যদিও এটি প্রতিক্রিয়া জানায় না।

আমি এই কোডটি যুক্ত করার চেষ্টা করেছি:

HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);

মধ্যে HttpClientStackএকটি ভিন্ন পূর্ণসংখ্যা (50000) এর ভলি কাঠামোর, কিন্তু এটি এখনও 50 সেকেন্ড আগে আউট বার।

টাইমআউটটি কোনও দীর্ঘ মানতে পরিবর্তন করার কোনও উপায় আছে কি?



21
@ অ্যাডামস্টেলম্যাসজেক - ভলি কাঠামোর নির্দিষ্ট বিবরণ সম্পর্কে এটি কোনও সদৃশ হবে না। HttpClientশ্রেণীর ব্যবহার সম্পর্কে যদি রেফারেন্সড এসও প্রশ্ন
মাইকেল বানজন

উত্তর:


357

দেখুন Request.setRetryPolicy()এবং এর জন্য DefaultRetryPolicyনির্মাতা, যেমন

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

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "Error: " + error.getMessage());
            }
});

myRequest.setRetryPolicy(new DefaultRetryPolicy(
        MY_SOCKET_TIMEOUT_MS, 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

আপনি কীভাবে কোনও অনুরোধের অগ্রাধিকার সেট করতে জানেন?
মার্কাস

2
@ মারকাস অনুরোধকে ওভাররাইড করে Requ ইমেজরেক্সেস্ট এটি করে। দ্রষ্টব্য: আপনার এটি আলাদা আলাদা SO প্রশ্নে জিজ্ঞাসা করা উচিত।
লারহাম 1

1
ভলিকে আমার অনুরোধটি অস্বীকার করতে বাধা দেওয়ার জন্য যা আমি খুঁজছিলাম যা 15 সেকেন্ড লাগে takes - থ্যাঙ্কস!
স্লট

সময়সীমাতে পুনরায় চেষ্টা নিষ্ক্রিয় করতে POST অনুরোধগুলির জন্য আমি এটি যুক্ত করেছি। এটি অবিশ্বাস্য ভুল যে Google বিকাশকারীরা POST অনুরোধগুলিতে পুনরায় চেষ্টা করার নীতি সেট করার সিদ্ধান্ত নিয়েছে। আমার সমস্যা সমাধান। ধন্যবাদ।
প্রবাদটি

1
@ রুন 13 সুনির্দিষ্টভাবে অনুরোধ করা নমুনা অনুরোধ নির্মাণকারীর দেখুন।
লারহাম 1

226

অ্যান্ড্রয়েড ভলির সময় শেষ করার জন্য আপনাকে ব্যবহার করা দরকার RetryPolicy

RetryPolicy

  • ভল্লি আপনার অনুরোধগুলির জন্য আপনার রিট্রিপলসি বাস্তবায়নের একটি সহজ উপায় সরবরাহ করে।
  • ভলি সমস্ত অনুরোধের জন্য 5 সেকেন্ডে ডিফল্ট সকেট এবং সংযোগআইটিআউট সেট করে।

RetryPolicy একটি ইন্টারফেস হ'ল টাইমআউট হওয়ার পরে আপনি কীভাবে কোনও বিশেষ অনুরোধ পুনরায় চেষ্টা করতে চান সে সম্পর্কে আপনার যুক্তিটি প্রয়োগ করতে হবে।

এটি এই তিনটি পরামিতি নিয়ে কাজ করে

  • সময়সীমা - প্রতি পুনরায় চেষ্টা করার জন্য প্রতি মিলিতে সকেটের সময়সীমা নির্দিষ্ট করে।
  • পুনরায় চেষ্টা করার সংখ্যা - পুনরায় চেষ্টা করার সময় সংখ্যা।
  • ব্যাক অফ মাল্টিপ্লায়ার - একটি গুণক যা প্রতিটি পুনরায় চেষ্টা করার জন্য সকেটে সেট করা এক্সফোনেনশিয়াল সময় নির্ধারণ করতে ব্যবহৃত হয়।

প্রাক্তন জন্য। যদি এই মানগুলি নিয়ে পুনরায় চেষ্টা করা হয় ry

সময়সীমা - 3000 এমএস, পুনরায় চেষ্টা করার সংখ্যা - 2, গুণিতক ব্যাক অফ - 2.0

চেষ্টা 1:

  • সময় = সময় + (সময় * ব্যাক অফ গুণক);
  • সময় = 3000 + 6000 = 9000 মিমি
  • সকেটের সময়সীমা = সময়;
  • 9 সেকেন্ডের সকেট সময়সীমার সাথে অনুরোধ প্রেরণ করা হয়েছে

চেষ্টা 2:

  • সময় = সময় + (সময় * ব্যাক অফ গুণক);
  • সময় = 9000 + 18000 = 27000 মিমি
  • সকেটের সময়সীমা = সময়;
  • 27 সেকেন্ডের সকেট সময়সীমার সাথে অনুরোধ প্রেরণ করা হয়েছে

তাই চেষ্টা আবার চেষ্টা করুন 2 এর পরেও যদি সকেটের সময়সীমা ঘটে তবে ভলি TimeoutErrorআপনার ইউআই ত্রুটির প্রতিক্রিয়া হ্যান্ডলারটিতে ফেলে দেবে ।

//Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions. 
//Volley does retry for you if you have specified the policy.
jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(5000, 
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

RetryPolicyবাস্তবায়ন আসলে কী করে তার বিস্তারিত উত্তরের জন্য ধন্যবাদ Thanks
dbm

5
সুন্দর উত্তর @ ইয়াকিভ ম্যাস্পান B তবে আপনার উদাহরণে প্রথম প্রচেষ্টাটির সময়টি 3000 + (3000 * 2) এর পরিবর্তে 0 + (3000 * 2)। এবং দ্বিতীয়টি 6000 + (3000 * 2)।
13 কেজেড

১৩ কেজেড, আমি বিশ্বাস করি আপনি সময় গণনার বিষয়ে এখনও ভুল আছেন, আমার সম্পাদনা দেখুন এবং ভলির উত্সের বিরুদ্ধে যাচাই করুন
প্রোটংগুন

1
: শুধু এই ব্যবহার মানুষের জন্য একটি অনুস্মারক সবসময় ব্যবহার new DefaultRetryPolicy(করুন এবং নিশ্চিত করুন পুনরায় ব্যবহার না একটি RetryPolicyবস্তু, যেমন বস্তুর সব অনুরোধ প্রক্রিয়ার মধ্য দিয়ে রেফারেন্সড হয়, এবং পুনরায় চেষ্টা করুন বাড়তি একই বস্তুর সময়সীমার মান উপর যোগ করা হয়, এইভাবে তৈরীর আপনার ভবিষ্যত অনুরোধ সময় সমাপ্ত অসীম হত্তয়া
আইজি পাসকুল

সংযোগ হ্যান্ডশেক সময় শেষ কিভাবে?
GMsoF

23

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

এটার মতো কিছু:

public class BaseRequest<T> extends Request<T> {

    public BaseRequest(int method, String url, Response.ErrorListener listener) {
        super(method, url, listener);
        setRetryPolicy(getMyOwnDefaultRetryPolicy());
    }
}

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


1
এই ঠিক কাজ করা উচিত? সেটেটরিপলিসি (নতুন ডিফল্ট রিটারি পলিসি (1000, ডিফল্ট রিট্রিপলিসি। ডিএএফএএলএফএইএলএইএইচএইচএলএফএইডিএফএএফএইএফএলT_BACKOFF_MULT));
LOG_TAG

12
/**
 * @param request
 * @param <T>
 */
public <T> void addToRequestQueue(Request<T> request) {

    request.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    getRequestQueue().add(request);
}

7
req.setRetryPolicy(new DefaultRetryPolicy(
    MY_SOCKET_TIMEOUT_MS, 
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

আপনি MY_SOCKET_TIMEOUT_MS100 হিসাবে সেট করতে পারেন you আপনি যা সেট করতে চান তা মিলিসেকেন্ডে। DEFAULT_MAX_RETRIES0 ডিফল্ট হয় 1।


4
int MY_SOCKET_TIMEOUT_MS=500;

 stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                MY_SOCKET_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


2

বিকল্প সমাধান যদি উপরের সমস্ত সমাধান আপনার পক্ষে কাজ করে না

ডিফল্টরূপে, ভোলি উভয়ের জন্য সমানভাবে setConnectionTimeout()এবং এর setReadTimeout()সাথে মানটি নির্ধারণ করে RetryPolicy। আমার ক্ষেত্রে, Volleyবড় ডেটা অংশের জন্য টাইমআউট ব্যতিক্রম দেখুন:

com.android.volley.toolbox.HurlStack.openConnection(). 

আমার সমাধানটি এমন একটি শ্রেণি তৈরি করা যা HttpStackআমার নিজস্ব setReadTimeout()নীতিতে প্রসারিত । তারপরে নিম্নলিখিত RequestQueueহিসাবে তৈরি করার সময় এটি ব্যবহার করুন:

Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())

1

আমি একটি পদ্ধতি যোগ করার শেষ পর্যন্ত setCurrentTimeout(int timeout)করতে RetryPolicyএবং এটা বাস্তবায়ন DefaultRetryPolicy

তারপরে আমি এ setCurrentTimeout(int timeout) অনুরোধ ক্লাসে ডাকলাম।

এই কাজটি মনে হচ্ছে।

উপায় দ্বারা আমার অলসতার জন্য দুঃখিত এবং মুক্ত উত্সের জন্য হুরয় ray

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.