একটি সাধারণ অনুরোধ পাঠান

আপনার Android অ্যাপে নেটওয়ার্ক অপারেশন পারফর্ম করার জন্য কীভাবে Cronet লাইব্রেরি ব্যবহার করবেন তা জানুন। Cronet হল Chromium নেটওয়ার্ক স্ট্যাক যা আপনার অ্যাপে ব্যবহার করার জন্য লাইব্রেরি হিসেবে উপলভ্য করা হয়েছে। লাইব্রেরি ফিচার সম্পর্কে আরও জানতে, Cronet ব্যবহার করে নেটওয়ার্ক অপারেশন সম্পন্ন করুন দেখুন।

আপনার প্রোজেক্টে লাইব্রেরি সেট-আপ করুন

আপনার প্রোজেক্টে Cronet লাইব্রেরিতে ডিপেন্ডেন্সি যোগ করতে এইসব ধাপ অনুসরণ করুন:

  1. Android Studio আপনার প্রোজেক্টের settings.gradle ফাইলে Google-এর Maven রিপোজিটরির রেফারেন্স অন্তর্ভুক্ত করেছে কিনা তা যাচাই করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

    গ্ৰুভি

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
  2. আপনার অ্যাপ মডিউলের build.gradle ফাইলের dependencies বিভাগে Cronet-এর জন্য Google Play পরিষেবা ক্লায়েন্ট লাইব্রেরির একটি রেফারেন্স অন্তর্ভুক্ত করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

    গ্ৰুভি

    dependencies {
       implementation 'com.google.android.gms:play-services-cronet:18.0.1'
    }

    Kotlin

    dependencies {
       implementation("com.google.android.gms:play-services-cronet:18.0.1")
    }

CronetEngine এই ডিপেন্ডেন্সি যোগ করার পরে তৈরি করা অবজেক্ট Google Play পরিষেবা থেকে লোড করা Cronet ব্যবহার করবে। CronetEngine অবজেক্ট তৈরি করার আগে CronetProviderInstaller.installProvider(Context) কল করুন যাতে CronetEngine তৈরি করার সময় অপ্রত্যাশিত ব্যতিক্রম না ঘটে, যেমন ডিভাইসে Google Play পরিষেবার আপডেট করা ভার্সন প্রয়োজন।

Google Play পরিষেবা থেকে Cronet লোড করা না গেলে, Cronet-এর API-এর একটি কম পারফর্ম্যান্সের ইমপ্লিমেন্টেশন ব্যবহার করা যেতে পারে। এই ফল-ব্যাক ইমপ্লিমেন্টেশন ব্যবহার করতে, org.chromium.net:cronet-fallback-এর উপর নির্ভর করুন এবং new JavaCronetProvider(context).createBuilder() কল করুন।

নেটওয়ার্ক অনুরোধ তৈরি করুন

এই বিভাগে Cronet লাইব্রেরি ব্যবহার করে কীভাবে নেটওয়ার্ক রিকোয়েস্ট তৈরি ও পাঠানো যায় তা দেখানো হয়েছে। নেটওয়ার্ক অনুরোধ পাঠানোর পরে, আপনার অ্যাপকে নেটওয়ার্ক উত্তর প্রসেস করতে হবে।

CronetEngine-এর ইনস্ট্যান্স তৈরি ও কনফিগার করা

লাইব্রেরি একটি CronetEngine.Builder ক্লাস প্রদান করে যা আপনি CronetEngine-এর ইনস্ট্যান্স তৈরি করতে ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণে দেখানো হয়েছে কীভাবে CronetEngine অবজেক্ট তৈরি করতে হয়:

Kotlin

val myBuilder = CronetEngine.Builder(context)
val cronetEngine: CronetEngine = myBuilder.build()

জাভা

CronetEngine.Builder myBuilder = new CronetEngine.Builder(context);
CronetEngine cronetEngine = myBuilder.build();

আপনি Builder ক্লাস ব্যবহার করে CronetEngine অবজেক্ট কনফিগার করতে পারবেন, যেমন আপনি ক্যাশিং ও ডেটা কম্প্রেশনের মতো বিকল্প প্রদান করতে পারবেন। আরও তথ্যের জন্য, CronetEngine.Builder দেখুন।

অনুরোধ কলব্যাকের একটি বাস্তবায়ন প্রদান করুন

কলব্যাকের ইমপ্লিমেন্টেশন প্রদান করতে, UrlRequest.Callback-এর সাবক্লাস তৈরি করুন এবং প্রয়োজনীয় অ্যাবস্ট্র্যাক্ট পদ্ধতি ইমপ্লিমেন্ট করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

private const val TAG = "MyUrlRequestCallback"

class MyUrlRequestCallback : UrlRequest.Callback() {
    override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) {
        Log.i(TAG, "onRedirectReceived method called.")
        // You should call the request.followRedirect() method to continue
        // processing the request.
        request?.followRedirect()
    }

    override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) {
        Log.i(TAG, "onResponseStarted method called.")
        // You should call the request.read() method before the request can be
        // further processed. The following instruction provides a ByteBuffer object
        // with a capacity of 102400 bytes for the read() method. The same buffer
        // with data is passed to the onReadCompleted() method.
        request?.read(ByteBuffer.allocateDirect(102400))
    }

    override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) {
        Log.i(TAG, "onReadCompleted method called.")
        // You should keep reading the request until there's no more data.
        byteBuffer.clear()
        request?.read(byteBuffer)
    }

    override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) {
        Log.i(TAG, "onSucceeded method called.")
    }
}

জাভা

class MyUrlRequestCallback extends UrlRequest.Callback {
  private static final String TAG = "MyUrlRequestCallback";

  @Override
  public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
    Log.i(TAG, "onRedirectReceived method called.");
    // You should call the request.followRedirect() method to continue
    // processing the request.
    request.followRedirect();
  }

  @Override
  public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
    Log.i(TAG, "onResponseStarted method called.");
    // You should call the request.read() method before the request can be
    // further processed. The following instruction provides a ByteBuffer object
    // with a capacity of 102400 bytes for the read() method. The same buffer
    // with data is passed to the onReadCompleted() method.
    request.read(ByteBuffer.allocateDirect(102400));
  }

  @Override
  public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {
    Log.i(TAG, "onReadCompleted method called.");
    // You should keep reading the request until there's no more data.
    byteBuffer.clear();
    request.read(byteBuffer);
  }

  @Override
  public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
    Log.i(TAG, "onSucceeded method called.");
  }
}

নেটওয়ার্ক টাস্ক ম্যানেজ করার জন্য Executor অবজেক্ট তৈরি করুন

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

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

জাভা

Executor executor = Executors.newSingleThreadExecutor();

UrlRequest অবজেক্ট তৈরি ও কনফিগার করা

নেটওয়ার্ক রিকোয়েস্ট তৈরি করতে, CronetEngine-এর newUrlRequestBuilder() মেথড কল করুন, যেখানে গন্তব্য URL, আপনার কলব্যাক ক্লাসের ইনস্ট্যান্স এবং এক্সিকিউটর অবজেক্ট পাস করা হয়। newUrlRequestBuilder() পদ্ধতিটি একটি UrlRequest.Builder অবজেক্ট রিটার্ন করে যা আপনি UrlRequest অবজেক্ট তৈরি করতে ব্যবহার করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

val requestBuilder = cronetEngine.newUrlRequestBuilder(
        "https://www.example.com",
        MyUrlRequestCallback(),
        executor
)

val request: UrlRequest = requestBuilder.build()

জাভা

UrlRequest.Builder requestBuilder = cronetEngine.newUrlRequestBuilder(
        "https://www.example.com", new MyUrlRequestCallback(), executor);

UrlRequest request = requestBuilder.build();

UrlRequest-এর ইনস্ট্যান্স কনফিগার করতে আপনি Builder ক্লাস ব্যবহার করতে পারবেন। যেমন, আপনি অগ্রাধিকার বা HTTP ভার্ব নির্দিষ্ট করতে পারেন। আরও তথ্যের জন্য, UrlRequest.Builder দেখুন।

নেটওয়ার্ক টাস্ক শুরু করতে, অনুরোধের start() পদ্ধতি কল করুন:

Kotlin

request.start()

জাভা

request.start();

এই বিভাগে দেওয়া নির্দেশাবলী অনুসরণ করে, আপনি Cronet ব্যবহার করে নেটওয়ার্ক রিকোয়েস্ট তৈরি করতে ও পাঠাতে পারবেন। তবে, সহজ করার জন্য, UrlRequest.Callback-এর উদাহরণ ইমপ্লিমেন্টেশন শুধুমাত্র লগে একটি মেসেজ প্রিন্ট করে। নিম্নলিখিত বিভাগটি দেখায় যে কীভাবে একটি কলব্যাক বাস্তবায়ন প্রদান করা যায় যা আরও দরকারী পরিস্থিতি সমর্থন করে, যেমন প্রতিক্রিয়া থেকে ডেটা বের করা এবং অনুরোধে ব্যর্থতা সনাক্ত করা।

নেটওয়ার্কের উত্তর প্রসেস করা

আপনি start() মেথড কল করলে, Cronet অনুরোধের লাইফসাইকেল শুরু হয়। আপনার অ্যাপকে লাইফসাইকেল চলাকালীন কলব্যাক নির্দিষ্ট করে অনুরোধ ম্যানেজ করতে হবে। লাইফসাইকেল সম্পর্কে আরও জানতে, Cronet অনুরোধের লাইফসাইকেল দেখুন। আপনি UrlRequest.Callback-এর সাবক্লাস তৈরি করে এবং নিম্নলিখিত পদ্ধতি প্রয়োগ করে কলব্যাক নির্দিষ্ট করতে পারবেন:

onRedirectReceived()

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

Kotlin

override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) {
  // Determine whether you want to follow the redirect.
  ...

  if (shouldFollow) {
      request?.followRedirect()
  } else {
      request?.cancel()
  }
}

জাভা

@Override
public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
  // Determine whether you want to follow the redirect.
  …

  if (shouldFollow) {
    request.followRedirect();
  } else {
    request.cancel();
  }
}
onResponseStarted()

চূড়ান্ত সেট হেডার পাওয়া গেলে ইনভোক করা হয়। সব রিডাইরেক্ট অনুসরণ করার পরেই শুধু onResponseStarted() পদ্ধতিটি চালু করা হয়। নিম্নলিখিত কোডটি পদ্ধতিটি প্রয়োগ করার একটি উদাহরণ দেখায়:

Kotlin

override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) {
  val httpStatusCode = info?.httpStatusCode
  if (httpStatusCode == 200) {
    // The request was fulfilled. Start reading the response.
    request?.read(myBuffer)
  } else if (httpStatusCode == 503) {
    // The service is unavailable. You should still check if the request
    // contains some data.
    request?.read(myBuffer)
  }
  responseHeaders = info?.allHeaders
}

জাভা

@Override
public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
  int httpStatusCode = info.getHttpStatusCode();
  if (httpStatusCode == 200) {
    // The request was fulfilled. Start reading the response.
    request.read(myBuffer);
  } else if (httpStatusCode == 503) {
    // The service is unavailable. You should still check if the request
    // contains some data.
    request.read(myBuffer);
  }
  responseHeaders = info.getAllHeaders();
}
onReadCompleted()

উত্তরের বডির অংশ পড়া হলে এটি চালু করা হয়। নিম্নলিখিত কোড উদাহরণ থেকে জানা যায় যে কীভাবে পদ্ধতি প্রয়োগ করতে হয় এবং উত্তরের বডি এক্সট্র্যাক্ট করতে হয়:

Kotlin

override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) {
  // The response body is available, process byteBuffer.
  ...

  // Continue reading the response body by reusing the same buffer
  // until the response has been completed.
  byteBuffer?.clear()
  request?.read(myBuffer)
}

জাভা

@Override
public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {
  // The response body is available, process byteBuffer.
  …

  // Continue reading the response body by reusing the same buffer
  // until the response has been completed.
  byteBuffer.clear();
  request.read(myBuffer);
}
onSucceeded()

নেটওয়ার্ক অনুরোধ সম্পূর্ণ হলে এটি চালু হয়। নিম্নলিখিত উদাহরণ থেকে পদ্ধতিটি কীভাবে প্রয়োগ করতে হয় তা জানুন:

Kotlin

override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) {
    // The request has completed successfully.
}

জাভা

@Override
public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
  // The request has completed successfully.
}
onFailed()

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

Kotlin

override fun onFailed(request: UrlRequest?, info: UrlResponseInfo?, error: CronetException?) {
    // The request has failed. If possible, handle the error.
    Log.e(TAG, "The request failed.", error)
}

জাভা

@Override
public void onFailed(UrlRequest request, UrlResponseInfo info, CronetException error) {
  // The request has failed. If possible, handle the error.
  Log.e(TAG, "The request failed.", error);
}
onCanceled()

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

Kotlin

override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) {
    // Free resources allocated to process this request.
    ...
}

জাভা

@Override
public void onCanceled(UrlRequest request, UrlResponseInfo info) {
  // Free resources allocated to process this request.
  …
}