Android 301Başlangıç seviyesi derslerde Android uygulama geliştirme ortamını detaylı olarak inceliyoruz.

Tüm Eğitimleri Aldın mı? Kendini sınamanın tam zamanı

Haydi Sınava Gir

Ağa Bağlanma

Kategori : Mobil | Lisans : Creative Commons Attribution 2.5 Generic (CC BY 2.5) | En son 11.05.2016 tarihinde güncellendi
Eğitmen : Geleceği Yazanlar Ekibi
Etiketler : android http android inputstream android thread

Bu içerik size ağa bağlanan basit bir uygulamanın nasıl yapılacağını gösterecektir. Ağa bağlanan uygulamalar yaparken takip etmeniz gereken bazı alışkanlıkları burada bulabilirsiniz.

Uygulamanızda ağ işlemleri yapabilmek için uygulamanızın manifest dosyasında şu izinlerin olması gerekir:

 

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

 

 

HTTP istemcisini seçmek

Ağ kullanımı yapan uygulamalar genellikle veri alışverişi için HTTP kullanırlar. Android'de iki tane HTTP istemci var. Bunlar HttpURLConnection ve Apache HttpClient'tır. Her ikisi de HTTPS, akış (stream) gönderme ve indirme, ayarlanabilir zaman aşımlarını, IPv6 ve bağlantı havuzlarının düzenlenmesini desteklemektedir. Google, Gingerbread ve üzeri sürümlerde HttpURLConnection'ın kullanılmasını tavsiye ediyor.

 

Ağ bağlantısını kontrol etmek

Uygulamanızı İnternet'e bağlanmadan önce getActiveNetworkInfo() ve isConnected() metotları ile cihazın ağa bağlı olup olmadığını kontrol etmelisiniz. Cihaz ağ kapsama alanında olmayabilir ya da kullanıcı WiFi ve mobil verisini kapatmış olabilir. Bu kontrolü sağlamak için kullanacağınız kod şablonu şu şekilde olacak:

public void myClickHandler(View view) {
    ...
    ConnectivityManager connMgr = (ConnectivityManager) 
        getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // veriyi çek
    } else {
        // hata mesajı
    }
    ...
}

 

Ağ işlemlerini ayrı iş parçacıklarında (thread) çalıştırmak

Ağ işlemlerinde öngörülemeyen gecikmeler olabilir. Bu gecikmelerin kullanıcı deneyimini azaltan yapısından dolayı bu işlemleri ayrı bir iş parçacığında (thread) yapmak, kullanıcı arayüzünden ayırmak gereklidir. Eşzamansız (asenkron) AsyncTask sınıfı, kullanıcı arayüzünden yeni görevleri yollamak için basit yollardan biridir.

Aşağıdaki örnekte myClickHandler() metodu new DownloadWebpageTask().execute(stringUrl) metodunu harekete geçirir. Buradaki DownloadWebpageTask sınıfı AsyncTask sınıfının bir alt sınıfıdır. DownloadWebpageTask sınıfı şu AsyncTask metodlarını kullanır:

  • doInBackground() metodu downloadUrl() metodunu çalıştırır. Web sayfasının URL'sini parametre olarak alır. Bu metot web sayfasındaki içeriği çekerek String şeklinde dönüş sağlar.
  • onPostExecute() metodu, dönen String'i alarak kullanıcı arayüzünde gösterir.

public class HttpExampleActivity extends Activity {
    private static final String DEBUG_TAG = "HttpExample";
    private EditText urlText;
    private TextView textView;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);   
        urlText = (EditText) findViewById(R.id.myUrl);
        textView = (TextView) findViewById(R.id.myText);
    }

    // kullanıcı butona tıkladığında Asycntask çağırılır
    // URL üzerinden veriyi çekmeden önce internet baglantısını kontrol etmelisiniz
    public void myClickHandler(View view) {
        // URL bilgisini UI'dan alıyoruz
        String stringUrl = urlText.getText().toString();
        ConnectivityManager connMgr = (ConnectivityManager) 
            getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            new DownloadWebpageTask().execute(stringUrl);
        } else {
            textView.setText("No network connection available.");
        }
    }
     private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
              
            // parametreler execute() çagırısından gelir: params[0] URL'nin yeridir.
            try {
                return downloadUrl(urls[0]);
            } catch (IOException e) {
                return "Web sayfası getirilemedi. Belki URL yanlıştır";
            }
        }
        // onPostExecute AsyncTask'tan dönen cevabı gösterir.
        @Override
        protected void onPostExecute(String result) {
            textView.setText(result);
       }
    }
    ...
}

Yukarıdaki kod parçasının yaptığı işlemi özetlersek;

  • Kullanıcı düğmeye tıkladığında myClickHandler() çağrılır ve uygulamadaki URL DownloadWebpageTask'e ulaştırılır.
  • AsyncTask'ın doInBackground() metodudownloadUrl() metodunu çağırır.
  • downloadUrl() metodu URL stringini alarak URL nesnesine çevirir.
  • URL nesnesi ise HttpURLConnection kurmak için kullanılır.
  • Bağlantı sağlandığında, HttpURLConnection nesnesi web sayfasının içeriğini InputStream'e çevirir.
  • InputStream readIt() metoduna geçirilir, bu metot stream nesnelerinin String'e çevrilmesini sağlar.
  • Son olarak, AsyncTask'ın onPostExecute() metoduyla String'i Activity'nizin kullanıcı arayüzünde gösterir.

 

Bağlanmak ve veri indirmek

İş parçacığınızda (thread) HttpURLConnection kullanarak GET isteğiyle verileri indirebilirsiniz. Sonrasında connect() metodunu çağırdığınızda verilerinizi InputStream şeklinde getInputStream() metoduyla alabilirsiniz.

Aşağıdaki örnekte doInBackground() metodu downloadUrl() metodunu çağırır. downloadUrl() metodu verilen URL'yi alır ve HttpURLConnection aracılığıyla bunu ağa bağlanmak için kullanır. Bağlantı sağlandığında, uygulama getInputStream() metodunu kullanarak InputStream şeklinde veriyi alır.

// verilen URL bağlantısı HttpURLConnection kullanarak sağlanır
// web sayfası bağlantısındaki veri InputStream şeklinde gelir
// InputStream String'e çevirilir.
private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    // Web sayfasından gelen verinin sadece 500 karakterini göstermek için
    int len = 500;
        
    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Sorguyu başlatmak
        conn.connect();
        int response = conn.getResponseCode();
        Log.d(DEBUG_TAG, "The response is: " + response);
        is = conn.getInputStream();
        // InputStream verisi string'e çeviriliyor
        String contentAsString = readIt(is, len);
        return contentAsString;
        
    // InputStream'i uygulama işi tamamlandığında kaptamayı unutmayın
    } finally {
        if (is != null) {
            is.close();
        } 
    }
}

getResponseCode() metodunun durum kodları döndürdüğüne dikkat etmek gerekir. Bu metot, bağlantı hakkında fazladan bilgi almak için kullanışlı bir yoldur. Örneğin HTTP 200 kodu işlemin başarılı olduğunu gösterir.

 

InputStream'i String'e dönüştürmek

InputStream okunabilir şekilde kaynak baytlarından oluşan bir yapıdır. InputStream aldığınızda bu veriyi genelde "decode" eder ya da ihtiyacınız olan veri tipine dönüştürürsünüz. Örneğin bir resim verisi indirdiğinizde "decode" etmeli ve aşağıda belirttiğimiz gibi kullanmalısınız.

InputStream is = null;
...
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap(bitmap);

Diğer örnekteyse InputStream, web sayfasındaki yazıya karşılık gelmektedir. İçeriğin uygulamanın arayüzünde gösterilecek yapı için String'e dönüştürülmesi işlemini şöyle yapabilirsiniz:

// InputStream'i okur ve String'e çevirir
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
    Reader reader = null;
    reader = new InputStreamReader(stream, "UTF-8");        
    char[] buffer = new char[len];
    reader.read(buffer);
    return new String(buffer);
}

 

Bu sayfadaki parçalar Android Open Source Project kapsamında oluşturulmuş ve paylaşılmış içeriğin küçük değişiklikler yapılmış hâlidir ve Creative Commons 2.5 Attribution License'ta belirlenen koşullara göre kullanılmıştır.

Bu eğitim içeriğinin orijinal hâline buradan ulaşabilirsiniz: Connecting to the Network