Basit istek gönderme

Bilgisayarınızda ağ işlemleri gerçekleştirmek için Cronet Library'yi nasıl kullanacağınızı öğrenin Android uygulaması. Cronet, kitaplık olarak kullanıma sunulan Chromium ağ yığınıdır oluşturmanız için bir fırsattır. Kitaplık özellikleri hakkında daha fazla bilgi için Aşağıdakileri kullanarak ağ işlemleri gerçekleştirme: Cronet'de bulabilirsiniz.

Projenizde kitaplığı ayarlama

Projenizde Cronet Kitaplığı'na bağımlılık eklemek için şu adımları izleyin:

  1. Android Studio'nun Google'ın Maven deposuna referans içerdiğini doğrulayın projenizin settings.gradle dosyasında gösterildiği gibi, örnek:

    Eski

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. Cronet için Google Play Hizmetleri İstemci Kitaplığı'na referans ekle uygulama modülünüzün build.gradle dosyasının dependencies bölümünde aşağıdaki örnekte gösterilmektedir:

    Eski

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

Bu kez CronetEngine nesne oluşturuldu Bağımlılık eklendiğinde, Google Play Hizmetleri'nden yüklenen Cronet kullanılır. Telefonla arama CronetProviderInstaller.installProvider(Context) beklenmedik istisnaları önlemek için CronetEngine nesne oluşturmadan önce CronetEngine oluşturma sırasında cihazlar gibi hatalar nedeniyle atılmasını engelleme Google Play hizmetlerinin güncellenmiş bir sürümünü gerektiriyor.

Cronet'in Google Play Hizmetleri'nden yüklenemediği durumlarda daha düşük performanslı bir uygulamadır. Kullanılacak bu yedek uygulama, org.chromium.net:cronet-fallback bağlı ve new JavaCronetProvider(context).createBuilder() numaralı telefonu arayın.

Ağ isteği oluşturma

Bu bölümde, Cronet kullanarak nasıl ağ isteği oluşturup göndereceğiniz gösterilmektedir Kitaplık'a dokunun. Ağ isteğini gönderdikten sonra, uygulamanız ağı işlemelidir yanıt ekleyin.

CronetEngine örneği oluşturma ve yapılandırma

Kitaplıkta sunulanlar CronetEngine.Builder sınıf veya örnek oluşturmak için kullanabileceğiniz CronetEngine. Aşağıdaki örnek CronetEngine nesnesinin nasıl oluşturulduğunu gösterir:

Kotlin

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

Java

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

Builder sınıfını kullanarak bir CronetEngine nesnesini sorgulayabilirsiniz. önbellek ve veri sıkıştırma gibi seçenekler sunar. Daha fazla bilgi için bkz. CronetEngine.Builder.

Geri çağırma isteğinin bir uygulamasını sağlayın

Geri çağırmanın uygulanmasını sağlamak için, UrlRequest.Callback ve aşağıdaki örnekte gösterildiği gibi gerekli soyut yöntemleri uygulayın:

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

Java

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

Ağ görevlerini yönetmek için Yürütücü nesnesi oluşturma

Ağı yürütmek için Executor sınıfını kullanabilirsiniz görevlerden biridir. Executor örneği almak için Executors sınıfının, şunu döndüren statik yöntemleri: Executor nesnesini ifade eder. Aşağıdaki örnekte Executor oluşturma işleminin nasıl yapılacağı gösterilmektedir newSingleThreadExecutor() kullanarak nesne yöntem:

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

UrlRequest nesnesi oluşturma ve yapılandırma

Ağ isteğini oluşturmak için newUrlRequestBuilder() CronetEngine hedef URL'yi, geri çağırma sınıfınızın bir örneğini ve yürütücü nesnesini içerir. newUrlRequestBuilder() yöntemi, UrlRequest.Builder nesne UrlRequest oluşturmak için kullanabileceğiniz nesnesini tanımlayın:

Kotlin

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

val request: UrlRequest = requestBuilder.build()

Java

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

UrlRequest request = requestBuilder.build();

Builder sınıfını kullanarak şunları yapabilirsiniz: UrlRequest örneğini yapılandırın. Örneğin, Örneğin, bir öncelik veya HTTP fiili belirtebilirsiniz. Daha fazla bilgi için bkz. UrlRequest.Builder.

Ağ görevini başlatmak için İsteğin start() yöntemi:

Kotlin

request.start()

Java

request.start();

Bu bölümdeki talimatları uygulayarak bir ağ oluşturup gönderebilirsiniz isteği gönderin. Ancak kolaylık olması açısından, uygulanması Yalnızca UrlRequest.Callback baskılar günlüğe bir mesaj ekler. Aşağıdaki bölümde, geri arama özelliğinin nasıl sağlanacağı gösterilmektedir veya başka bir kaynaktan veri ayıklama gibi daha kullanışlı senaryoları destekleyen bir ve istekte bir hata algılanır.

Ağ yanıtını işleme

start() yöntemini kullandığınızda, Cronet isteğinin yaşam döngüsü başlatılır. Uygulamanız isteğini geri çağırmak için kullanır. yaşam döngüsü için Cronet isteği yaşam döngüsü boyunca geçerlidir. Hedeflerinize göre bir bir alt sınıf oluşturarak UrlRequest.Callback ve aşağıdaki yöntemleri uygulayarak:

onRedirectReceived()

Sunucu gerekir. Yeni hedefe giden yönlendirmeyi izlemek için followRedirect() yöntemidir. Aksi takdirde cancel() yöntemidir. Aşağıdaki örnekte, yöntemin nasıl uygulanacağı gösterilmektedir:

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

Java

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

Nihai başlık grubu alındığında çağrılır. onResponseStarted() yöntemi yalnızca tüm yönlendirmeler izleildikten sonra çağrılır. Aşağıdaki kod aşağıdaki yöntemin örnek bir uygulamasını gösterir:

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
}

Java

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

Yanıt gövdesinin bir bölümü her okunduğunda çağrılır. Aşağıdaki kod örnek, yöntemin nasıl uygulanacağını ve yanıt gövdesinin nasıl çıkarılacağını gösterir:

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

Java

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

Ağ isteği başarıyla tamamlandığında çağrılır. Aşağıdakiler örnek, yöntemin nasıl uygulanacağını gösterir:

Kotlin

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

Java

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

Şu tarihten sonra herhangi bir nedenle istek başarısız olursa çağrılır: start() yöntemi çağrıldı. İlgili içeriği oluşturmak için kullanılan aşağıdaki örnekte, yöntemin nasıl uygulanacağı gösterilmektedir. Ayrıca, hata:

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

Java

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

İstek cancel() yöntemini kullanabilirsiniz. Bir kez çağrıldıktan sonra diğer yöntemlerin UrlRequest.Callback sınıf çağrılır. Bu yöntemi kullanarak bir isteğinde bulunabilirsiniz. Aşağıdaki örnekte, yöntemin nasıl uygulanacağı gösterilmektedir:

Kotlin

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

Java

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