Soru & Cevap

Android AsyncTask'te Hata Kontrolü ?

04.02.2015 - 05:00

Arkadaşlar merhaba, androidte asynctask kullanarak sunucuma veri gönderiyorum 
Fakat şöyle bir problemim var, bir şekilde işlem sırasında internetin gittiğini veya teknik bir problemin olduğunda uygulamanın kapanmaması için nasıl bir hata kontrolü yapmalıyım ? Gerekli try catchler var ama yinede uygulamayı atıyorum internet bağlantısı olmadan açtığımda direk uygulamayı kapatıyor, ben uygulamayı kapatmadan yine devam etmesini istiyorum

Async Class'ım

[code]

public class MyServiceAsync extends AsyncTask<String, String, Boolean> {

        private String json;
        private JSONObject jObj;

        @Override
        protected Boolean doInBackground(String... params) {

            Boolean result = false;


            try {

                JSONArray jsonArrays = GetJson(params[0]).getJSONArray("GetPost");
                if (jsonArrays.length() > 0) result = true;

            } catch (JSONException e) {

                e.printStackTrace();
            }
            return result;

        }

        @Override
        protected void onPostExecute(Boolean result) {


        }

        private JSONObject GetJson(String URL) throws JSONException {
            // Making HTTP request
            try {

                URL url = new URL(URL);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestProperty("Content-Type", "0");
                httpURLConnection.setRequestMethod("GET");
                //httpURLConnection.setRequestProperty("Connection", "close");
                httpURLConnection.setUseCaches(false);
                httpURLConnection.setConnectTimeout(60000);
                httpURLConnection.setReadTimeout(60000);
                httpURLConnection.setAllowUserInteraction(false);
                httpURLConnection.setInstanceFollowRedirects(true);
                httpURLConnection.connect();
                int status = httpURLConnection.getResponseCode();


                switch (status) {
                    case 200:
                    case 201:
                        BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
                        StringBuilder sb = new StringBuilder();
                        String line;
                        while ((line = br.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                        br.close();
                        json = sb.toString();
                        jObj = new JSONObject(json);
                }

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return jObj;
        }


    }

[/code]

28 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-31404-1421919825.png
muhcob
05.02.2015 - 10:23

"catch" içerisinde hataları yakalamışsın. Bu durumda herhangi bir hata oluştuğunda yeni bir sayfaya gönderip "Bir hata oluştu!" şeklinde bir uyarı verebilirsin. "Sporx" ve "GollerCepte" bu şekilde çalışıyor. Ama ben herhangi bir şekilde internet bağlantısı kesildiğinde yapılan requestleri iptal etmeni tavsiye ederim. Bu şekilde daha temiz bir uygulama olur. 

Türkeş Efe
05.02.2015 - 11:44
Bahsettiğin requestleri iptal etme olayını nasıl yapabilirim ?
Muhammed ÇOBANOĞLU
05.02.2015 - 11:54
Post ya da get işlemi yaparken öncesinde internet kontrolü yapabilirsin. İnternet bağlantısı varsa işlem başlar. Aksi halde başlamaz. Fakat işlem sırasında oluşup catch'e düşerse daha önce bahsettiğim şekilde bir sayfaya yönlendirme yaparak "Bir hata oluştu!" gibi bir uyarı verebilirsin.
Türkeş Efe
06.02.2015 - 09:29
Soruyu anlamak istemiyorsunuz herhalde, diyorum ki internet bağlantısı olduğu halde bir hata oluştuğunda uygulama çakılmasın devam etsin ???????
Muhammed ÇOBANOĞLU
06.02.2015 - 10:02
Sanırım sen de benim söylediklerimi anlamak istemiyorsun. Uygulama servise bir request yaptığında ya da response alırken bir sıkıntı olduğunda herhangi bir sayfaya yönlendir bu sayfa uygulamanın "Anasayfa"sı olabilir. Normalde tüm post ve get işlemlerinde internet kontrolü yaptığın için "Anasayfa" açıldığında uygulama patlamayacak. Zaten uygulamanın "Anasayfa"sı bir kere yüklendiğinde servisten gelen datayı veritabanına kayıt edersen herhangi bir hatada "Anasayfa"ya yönledirirsin. "Anasayfaya" açıldığında servisten tekrar verileri çekmeyip veritabanındakileri kullanacaktır. Başka bir çözüm yolu aklıma gelmiyor.
Samet
06.02.2015 - 04:03
up
Türkeş Efe
06.02.2015 - 04:04
:)) bu asynctask'i arka planda çalışan bir servis içindeki timer ile belirli period ile tetikliyorum, uygulama kapalı iken bile çalışıyor arkada, sayfa yönlendirme yapmam mümkün değil, uygulama request atarken veya alırken hataya düştüğünde, 'Uygulama durduruldu kapat' hatasını vermeden çalışma hayatına devam etmeli. Yani bir sonraki timer'ın olayında tekrar rquest atmalı. Yok mu yani bunu nasıl yapabileceğimi söylicek bir arkadaş ?????
picture-17846-1496738325.jpg
haciabdullahsarikaya
04.02.2015 - 10:59

Merhaba,

Öncelikle uygulamaya girişte internet bağlantısı kontrolü yaptırmalısın.Verileri çekmeye başlamadan önce eğer bağlantı durumu true dönerse execute edebilirsin.Bu durumu kontrol etmek için:

[code]
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ı } ... }
[/code]

bu kodu deneyebilirsin.Kaynak:https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-301/aga-baglanma

Teknik problem olduğunda zaten catch içindekiler çalışır.Ona göre ayarlarsın.

Kolay gelsin.

 

Türkeş Efe
05.02.2015 - 09:24
İstediğim bu değil, internet kontrolünden geçse bile hataya düştüğünde uygulamanın kapanmamasını istiyorum ! catch in içindeki çalıştıktan sonra uygulama kapat hatası veriyor, bunu vermesin çalışmaya devam etsin ????