'Android.os.NetworkOnMainThreadException' ├Â─česini nas─▒l d├╝zeltebilirim?


Al─▒nan cevaba git


Android projemi RssReader i├žin ├žal─▒┼čt─▒r─▒rken hatam oldu.

Kod:

 URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RssHandler theRSSHandler = new RssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();
 

Ve a┼ča─č─▒daki hatay─▒ g├Âsterir:

 android.os.NetworkOnMainThreadException
 

Bu sorunu nas─▒l d├╝zeltebilirim?


2288









Cevap say─▒s─▒n─▒ say: 30






Bu istisna, bir uygulama ana i┼č par├žac─▒─č─▒nda a─č olu┼čturma i┼člemini denedi─činde ortaya ├ž─▒kar. Kodunuzu ├žal─▒┼čt─▒r─▒n AsyncTask :

 class RetrieveFeedTask extends AsyncTask<String, Void, RSSFeed> {

    private Exception exception;

    protected RSSFeed doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            XMLReader xmlreader = parser.getXMLReader();
            RssHandler theRSSHandler = new RssHandler();
            xmlreader.setContentHandler(theRSSHandler);
            InputSource is = new InputSource(url.openStream());
            xmlreader.parse(is);

            return theRSSHandler.getFeed();
        } catch (Exception e) {
            this.exception = e;

            return null;
        } finally {
            is.close();
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // TODO: check this.exception
        // TODO: do something with the feed
    }
}
 

G├Ârev nas─▒l y├╝r├╝t├╝l├╝r:

Gelen MainActivity.java dosyan─▒n E─čer i├žinde bu sat─▒r─▒ ekleyebilirsiniz oncreate() y├Ântemle

 new RetrieveFeedTask().execute(urlToRssFeed);
 

Bunu AndroidManifest.xml dosyaya eklemeyi unutmay─▒n :

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

2482







A─č i┼člemlerini neredeyse her zaman bir i┼č par├žac─▒─č─▒nda veya zaman uyumsuz bir g├Ârev olarak ├žal─▒┼čt─▒rmal─▒s─▒n─▒z.

Ama olan bu k─▒s─▒tlamay─▒ kald─▒rmak ve sonu├žlar─▒n─▒ kabul etmeye istekli olup olmad─▒─č─▒n─▒, varsay─▒lan davran─▒┼č─▒ ge├žersiz k─▒lmak m├╝mk├╝n.

Eklemek:

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 
 

S─▒n─▒f─▒nda,

ve

Android manifest.xml dosyas─▒na bu izni ekleyin:    

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

sonu├žlar:

Uygulaman─▒z (sivilceli internet ba─člant─▒s─▒ alanlar─▒nda) yan─▒t vermeyecek ve kilitlenecek, kullan─▒c─▒ yava┼člamay─▒ alg─▒layacak ve bir zorla ├Âld├╝rme yapmak zorunda kalacak ve etkinlik y├Âneticisinin uygulaman─▒z─▒ ├Âld├╝rmesi ve kullan─▒c─▒ya uygulaman─▒n durdu─čunu s├Âylemesi riskiyle kar┼č─▒ kar┼č─▒ya kalacaks─▒n─▒z.

Android, yan─▒t verebilirlik i├žin iyi programlama uygulamalar─▒na ili┼čkin iyi ipu├žlar─▒na sahiptir: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html


641







Bu problemi yenisini kullanarak ├ž├Âzd├╝m Thread .

 Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try  {
            //Your code goes here
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

thread.start(); 
 

403







Kabul edilen cevab─▒n baz─▒ ├Ânemli y├Ânleri vard─▒r. Ne yapt─▒─č─▒n─▒z─▒ ger├žekten bilmiyorsan─▒z , a─č ileti┼čimi i├žin AsyncTask kullanman─▒z ├Ânerilmez . A┼ča─č─▒ y├Ânlerden baz─▒lar─▒ ┼čunlard─▒r:

  • Statik olmayan i├ž s─▒n─▒flar olarak olu┼čturulan AsyncTask, ├ževreleyen Faaliyet nesnesine, i├žeri─čine ve bu etkinlik taraf─▒ndan olu┼čturulan t├╝m G├Âr├╝n├╝m hiyerar┼čisine a├ž─▒k bir referansa sahiptir. Bu ba┼čvuru AsyncTask'─▒n arka plan ├žal─▒┼čmas─▒ tamamlanana kadar Faaliyetin toplanmas─▒n─▒ ├Ânler. Kullan─▒c─▒n─▒n ba─člant─▒s─▒ yava┼čsa ve / veya indirme i┼člemi b├╝y├╝kse, bu k─▒sa s├╝reli bellek s─▒z─▒nt─▒lar─▒ sorun olabilir - ├Ârne─čin, y├Ânlendirme birka├ž kez de─či┼čirse (ve y├╝r├╝tme g├Ârevlerini iptal etmiyorsan─▒z) veya kullan─▒c─▒ Faaliyetten uzak.
  • AsyncTask, ├╝zerinde ├žal─▒┼čt─▒─č─▒ platforma ba─čl─▒ olarak farkl─▒ y├╝r├╝tme ├Âzelliklerine sahiptir: API seviyesi 4'ten ├Ânce AsyncTasks, tek bir arka plan i┼č par├žac─▒─č─▒nda seri olarak y├╝r├╝t├╝l├╝r; API seviyesi 4'ten API seviyesi 10'a kadar AsyncTasks, 128 konuya kadar olan bir havuzda ├žal─▒┼čt─▒r─▒l─▒r; API seviye 11'den itibaren AsyncTask, tek bir arka plan i┼č par├žac─▒─č─▒nda seri olarak ├žal─▒┼čt─▒r─▒l─▒r (a┼č─▒r─▒ y├╝klenmi┼č executeOnExecutor y├Ântemi kullanmazsan─▒z ve alternatif bir y├╝r├╝t├╝c├╝ tedarik etmezseniz ). Seri olarak ICS'de ├žal─▒┼čt─▒r─▒ld─▒─č─▒nda d├╝zg├╝n ├žal─▒┼čan kod, Gingerbread'te e┼čzamanl─▒ olarak ├žal─▒┼čt─▒r─▒ld─▒─č─▒nda k─▒r─▒labilir, ├Ârne─čin, yanl─▒┼čl─▒kla y├╝r├╝tme s─▒ras─▒na ba─čl─▒l─▒─č─▒n─▒z varsa.

K─▒sa s├╝reli haf─▒za s─▒z─▒nt─▒lar─▒ndan ka├ž─▒nmak, t├╝m platformlarda iyi tan─▒mlanm─▒┼č y├╝r├╝tme ├Âzelliklerine sahip olmak ve ger├žekten sa─člam bir a─č kullan─▒m─▒ olu┼čturmak i├žin bir temele sahip olmak istiyorsan─▒z, ┼čunlar─▒ d├╝┼č├╝nebilirsiniz:

  1. Sizin i├žin iyi i┼č ├ž─▒karan bir k├╝t├╝phane kullanmak - bu sorudaki a─č k├╝t├╝phanelerinin iyi bir kar┼č─▒la┼čt─▒rmas─▒ var ya da
  2. Faaliyetin y├Ântemiyle sonucu d├Ând├╝rmek i├žin , a Service veya IntentService yerine, belki de a ile . PendingIntent onActivityResult

IntentService yakla┼č─▒m─▒

A┼ča─č─▒ taraf:

  • AsyncTask D├╝┼č├╝nd├╝─č├╝n├╝z kadar olmasa da, daha fazla kod ve karma┼č─▒kl─▒k
  • ─░stekleri s─▒raya koyacak ve bunlar─▒ tek bir arka plan i┼č par├žac─▒─č─▒nda ├žal─▒┼čt─▒racak . Kolayca de─či┼čtirerek bu kontrol edebilirsiniz IntentService e┼čde─čer ile Service belki gibi, uygulama bu bir .
  • ┼×u anda ba┼čkalar─▒n─▒ d├╝┼č├╝nemiyorum asl─▒nda.

Yukar─▒-taraf:

  • K─▒sa s├╝reli haf─▒za s─▒z─▒nt─▒s─▒ problemini ├Ânler
  • A─č operasyonlar─▒ u├žu┼č s─▒ras─▒nda etkinli─činiz yeniden ba┼člarsa, onActivityResult y├Ântemi arac─▒l─▒─č─▒yla indirme sonucunu yine de alabilir.
  • Sa─člam a─č kodu olu┼čturmak ve yeniden kullanmak i├žin AsyncTask'tan daha iyi bir platform. ├ľrnek: ├ľnemli bir y├╝kleme yapmak gerekiyorsa, onu yapabilece─či AsyncTask bir in Activity , ancak kullan─▒c─▒ bir telefon konu┼čmas─▒ almaya uygulamas─▒ndan ├ž─▒k─▒┼č ba─člam anahtarlar─▒, sistem olabilir y├╝kleme tamamlamadan ├Ânce uygulama kapat─▒lacakt─▒r. ├ľyle az olas─▒l─▒kla aktif olan bir uygulamay─▒ ├Âld├╝rmek i├žin Service .
  • E─čer kendi e┼čzamanl─▒ versiyonunu kullan─▒yorsan─▒z IntentService (yukar─▒da ba─člad─▒─č─▒m gibi) e┼čzamanl─▒l─▒k seviyesini Executor .

Uygulama ├Âzeti

IntentService Tek bir arka plan i┼č par├žac─▒─č─▒nda indirmeleri olduk├ža kolay bir ┼čekilde ger├žekle┼čtirmek i├žin bir uygulayabilirsiniz.

Ad─▒m 1: IntentService ─░ndirme i┼člemini ger├žekle┼čtirmek i├žin bir olu┼čturun . Sen ne ├╝zerinden indirmek i├žin bunu s├Âyleyebilirim Intent ekstra olanaklar ve bir pas PendingIntent sonucu d├Ânmek i├žin kullanmak Activity :

 import android.app.IntentService;
import android.app.PendingIntent;
import android.content.Intent;
import android.util.Log;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class DownloadIntentService extends IntentService {

    private static final String TAG = DownloadIntentService.class.getSimpleName();

    public static final String PENDING_RESULT_EXTRA = "pending_result";
    public static final String URL_EXTRA = "url";
    public static final String RSS_RESULT_EXTRA = "url";

    public static final int RESULT_CODE = 0;
    public static final int INVALID_URL_CODE = 1;
    public static final int ERROR_CODE = 2;

    private IllustrativeRSSParser parser;

    public DownloadIntentService() {
        super(TAG);

        // make one and re-use, in the case where more than one intent is queued
        parser = new IllustrativeRSSParser();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        PendingIntent reply = intent.getParcelableExtra(PENDING_RESULT_EXTRA);
        InputStream in = null;
        try {
            try {
                URL url = new URL(intent.getStringExtra(URL_EXTRA));
                IllustrativeRSS rss = parser.parse(in = url.openStream());

                Intent result = new Intent();
                result.putExtra(RSS_RESULT_EXTRA, rss);

                reply.send(this, RESULT_CODE, result);
            } catch (MalformedURLException exc) {
                reply.send(INVALID_URL_CODE);
            } catch (Exception exc) {
                // could do better by treating the different sax/xml exceptions individually
                reply.send(ERROR_CODE);
            }
        } catch (PendingIntent.CanceledException exc) {
            Log.i(TAG, "reply cancelled", exc);
        }
    }
}
 

Ad─▒m 2: Hizmeti a┼ča─č─▒daki bildirime kaydedin:

 <service
        android:name=".DownloadIntentService"
        android:exported="false"/>
 

Ad─▒m 3: Sonucu d├Ând├╝rmek i├žin Hizmetin kullanaca─č─▒ bir PendingResult nesnesini ileterek hizmeti Faaliyetten ├ža─č─▒r─▒n:

 PendingIntent pendingResult = createPendingResult(
    RSS_DOWNLOAD_REQUEST_CODE, new Intent(), 0);
Intent intent = new Intent(getApplicationContext(), DownloadIntentService.class);
intent.putExtra(DownloadIntentService.URL_EXTRA, URL);
intent.putExtra(DownloadIntentService.PENDING_RESULT_EXTRA, pendingResult);
startService(intent);
 

Ad─▒m 4: Sonucu onActivityResult ile ele al─▒n:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == RSS_DOWNLOAD_REQUEST_CODE) {
        switch (resultCode) {
            case DownloadIntentService.INVALID_URL_CODE:
                handleInvalidURL();
                break;
            case DownloadIntentService.ERROR_CODE:
                handleError(data);
                break;
            case DownloadIntentService.RESULT_CODE:
                handleRSS(data);
                break;
        }
        handleRSS(data);
    }
    super.onActivityResult(requestCode, resultCode, data);
}
 

Tam ├žal─▒┼čan bir Android-Studio / gradle projesi i├žeren bir github projesi burada mevcuttur .


154







Petek ├╝zerindeki UI i┼č par├žac─▒─č─▒nda a─č G / ├ç ger├žekle┼čtiremezsiniz . Teknik olarak ise Android'in eski s├╝r├╝mlerinde m├╝mk├╝n, ama buna uygulama yan─▒t vermemesine neden olur ve k├Ât├╝ huylu olma i├žin uygulaman─▒z─▒ ├Âld├╝rme OS neden olabilir olarak ger├žekten k├Ât├╝ bir fikirdir. Bir arkaplan i┼člemi ├žal─▒┼čt─▒rman─▒z ya da a─č i┼čleminizi bir arkaplan i┼č par├žac─▒─č─▒nda ger├žekle┼čtirmek i├žin AsyncTask kullanman─▒z gerekir.https://en.wikipedia.org/wiki/Android_version_history%23Android_3.0_Honeycomb_.28API_level_11.29#Android_3.0_Honeycomb_.28API_level_11.29

Bunun i├žin iyi bir giri┼č olan Android geli┼čtirici sitesinde Painless Threading hakk─▒nda bir makale var ve burada size ger├žek├ži ┼čekilde verilebilecek olandan ├žok daha iyi bir cevap derinli─či sa─člayacak.


140







  1. StrictMode kullanmay─▒n (yaln─▒zca hata ay─▒klama modunda)
  2. SDK s├╝r├╝m├╝n├╝ de─či┼čtirmeyin
  3. Ayr─▒ bir iplik kullanmay─▒n

Servis veya AsyncTask Kullan

Ayr─▒ca bkz. Y─▒─č─▒n Ta┼čmas─▒ sorusu:

android.os.NetworkOnMainThreadException Android'den bir e-posta g├Ânderme


71







A─č ba┼čka bir i┼č par├žac─▒─č─▒nda eylemleri yap─▒n

├ľrne─čin:

 new Thread(new Runnable(){
    @Override
    public void run() {
        // Do network action in this function
    }
}).start();
 

Ve bunu AndroidManifest.xml dosyas─▒na ekleyin.

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

70







S─▒k─▒ modu a┼ča─č─▒daki kodu kullanarak devre d─▒┼č─▒ b─▒rak─▒rs─▒n─▒z:

 if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
 

Bu ├Ânerilmez : AsyncTask aray├╝z├╝ kullan─▒n .

Her iki y├Ântem i├žin de tam kod


56







A─č tabanl─▒ i┼člemler ana i┼č par├žac─▒─č─▒nda ├žal─▒┼čt─▒r─▒lamaz. T├╝m a─č tabanl─▒ g├Ârevleri bir alt i┼č par├žac─▒─č─▒nda ├žal─▒┼čt─▒rman─▒z veya AsyncTask uygulamas─▒n─▒ uygulaman─▒z gerekir.

Alt i┼č par├žac─▒─č─▒nda bir g├Ârevi nas─▒l ├žal─▒┼čt─▒raca─č─▒n─▒z:

 new Thread(new Runnable(){
    @Override
    public void run() {
        try {
            // Your implementation goes here
        } 
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}).start();
 

50







Kodunuzu i├žine yerle┼čtirin:

 new Thread(new Runnable(){
    @Override
    public void run() {
        try {
            // Your implementation
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}).start();
 

Veya:

 class DemoTask extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground(Void... arg0) {
        //Your implementation
    }

    protected void onPostExecute(Void result) {
        // TODO: do something with the feed
    }
}
 

46







Android Ek A├ž─▒klamalar─▒n─▒ kullanmak bir se├ženektir. Herhangi bir y├Ântemi bir arka plan i┼č par├žac─▒─č─▒nda ├žal─▒┼čt─▒rman─▒za izin verir:

 // normal method
private void normal() {
    doSomething(); // do something in background
}

@Background
protected void doSomething() 
    // run your networking code here
}
 

Basitlik ve okunabilirlik avantajlar─▒ sa─člamas─▒na ra─čmen, dezavantajlar─▒ vard─▒r.


43







Bu Android 3.0 ve ├╝zeri s├╝r├╝mlerde olur. Android 3.0 ve ├╝zeri s├╝r├╝mlerde, a─č i┼člemlerini (─░nternete eri┼čen i┼člevler) ana i┼č par├žac─▒─č─▒ / UI i┼č par├žac─▒─č─▒nda (sizin olu┼čturdu─čunuzda ve etkinlikte ├Âzge├žmi┼č y├Ântemlerinde ortaya ├ž─▒kanlar─▒n) ├žal─▒┼čt─▒r─▒lmas─▒n─▒ k─▒s─▒tlad─▒lar.

Bu, a─č i┼člemleri i├žin ayr─▒ i┼č par├žac─▒klar─▒ kullan─▒lmas─▒n─▒ te┼čvik etmektir. A─č etkinliklerinin do─čru ┼čekilde nas─▒l ger├žekle┼čtirilece─čiyle ilgili daha fazla ayr─▒nt─▒ i├žin AsyncTask'a bak─▒n .


42







Hata, ana i┼č par├žac─▒─č─▒nda uzun s├╝ren i┼člemleri y├╝r├╝tme nedeniyle, AsynTask veya Thread kullanarak sorunu kolayca d├╝zeltebilirsiniz . Daha iyi kullan─▒m i├žin bu k├╝t├╝phane AsyncHTTPClient'i inceleyebilirsiniz .

 AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // Called before a request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // Called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // Called when response HTTP status is "4XX" (for example, 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // Called when request is retried
    }
});
 

40







Herhangi bir a─č i┼člemi, dosya G / ├ç veya SQLite veritaban─▒ i┼člemleri gibi ana i┼č par├žac─▒─č─▒nda (UI i┼č par├žac─▒─č─▒) zaman alan bir i┼člem yapmamal─▒s─▒n─▒z. Bu t├╝r bir i┼člem i├žin bir ├žal─▒┼čan i┼č par├žac─▒─č─▒ olu┼čturmal─▒s─▒n─▒z, ancak sorun ┼ču ki, ├žal─▒┼čan i┼č par├žac─▒─č─▒n─▒zdan UI ile ilgili herhangi bir i┼člemi do─črudan ger├žekle┼čtiremezsiniz. Bunun i├žin, kullanmak Handler ve ge├žmek zorunda Message .

T├╝m bunlar─▒ basitle┼čtirmek i├žin, Android ├že┼čitli yollar─▒ gibi sa─člar AsyncTask , AsyncTaskLoader , CursorLoader veya IntentService . B├Âylece bunlardan herhangi birini gereksinimlerinize g├Âre kullanabilirsiniz.


38







Spektom'un en iyi cevab─▒ m├╝kemmel ├žal─▒┼č─▒yor.

AsyncTask Sat─▒r i├ži yaz─▒ yaz─▒yorsan─▒z ve bir s─▒n─▒f olarak geni┼člemiyorsan─▒z ve bunun ├╝zerine, bir yan─▒t almak i├žin bir ihtiya├ž varsa, a┼ča─č─▒daki y├Ântemi AsyncTask kullanabilirsiniz get() .

 RSSFeed feed = new RetreiveFeedTask().execute(urlToRssFeed).get();
 

(Onun ├Ârne─činden.)


37







Bu sadece Honeycomb SDK veya daha ├╝st├╝n├╝ hedefleyen uygulamalar i├žin f─▒rlat─▒l─▒r . Daha ├Ânceki SDK s├╝r├╝mlerini hedef alan uygulamalar─▒n ana olay d├Âng├╝s├╝ ba┼čl─▒klar─▒ ├╝zerinde a─č olu┼čturmalar─▒na izin verilir.

Hata SDK uyar─▒s─▒!


31







Benim i├žin bu oldu:

 <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="10" />
 

Uygulamam─▒ test etti─čim cihaz SD.2 S├╝r├╝m 16 olan 4.1.2 idi!

Hedef s├╝r├╝m├╝n Android Hedef K├╝t├╝phanenizle ayn─▒ oldu─čundan emin olun. Hedef k├╝t├╝phanenizin ne oldu─čundan emin de─čilseniz, Project -> Build Path -> Android se├ženeklerini sa─č t─▒klay─▒n ve i┼čaretli olan─▒ se├žin.

Ayr─▒ca, ba┼čkalar─▒n─▒n da belirtti─či gibi, ─░nternetÔÇÖe eri┼čmek i├žin do─čru izinleri ekleyin:

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

26







Sadece a├ž─▒k├ža bir ┼čeyi hecelemek i├žin:

Ana i┼č par├žac─▒─č─▒ temelde UI i┼č par├žac─▒─č─▒d─▒r.

Dolay─▒s─▒yla, ana i┼č par├žac─▒─č─▒nda a─č olu┼čturma i┼člemlerini yapamayaca─č─▒n─▒z─▒ s├Âylemek, UI i┼č par├žac─▒─č─▒nda a─č olu┼čturma i┼člemlerini yapamayaca─č─▒n─▒z *runOnUiThread(new Runnable() { ... }* anlam─▒na gelir; bu, a─č i┼člemlerini ba┼čka bir i┼č par├žac─▒─č─▒n─▒n i├žindeki bir blokta da yapamayaca─č─▒n─▒z anlam─▒na gelir .

(Ben sadece neden bu hatay─▒ ana i┼č par├žamdan ba┼čka bir yere ald─▒─č─▒m─▒ anlamaya ├žal─▒┼č─▒rken uzun bir kafa ka┼č─▒ma an─▒ ya┼čad─▒m. Bu y├╝zden; bu konu yard─▒m etti; umar─▒m bu yorum ba┼čkas─▒na yard─▒mc─▒ olacakt─▒r.)


23







Bunu Faaliyetinizde kullan─▒n.

     btnsub.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

                    //Initialize soap request + add parameters
                    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);

                    //Use this to add parameters
                    request.addProperty("pincode", txtpincode.getText().toString());
                    request.addProperty("bg", bloodgroup.getSelectedItem().toString());

                    //Declare the version of the SOAP request
                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                    envelope.setOutputSoapObject(request);
                    envelope.dotNet = true;

                    try {
                        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                        //this is the actual part that will call the webservice
                        androidHttpTransport.call(SOAP_ACTION1, envelope);

                        // Get the SoapResult from the envelope body.
                        SoapObject result = (SoapObject) envelope.getResponse();
                        Log.e("result data", "data" + result);
                        SoapObject root = (SoapObject) result.getProperty(0);
                        // SoapObject s_deals = (SoapObject) root.getProperty(0);
                        // SoapObject s_deals_1 = (SoapObject) s_deals.getProperty(0);
                        //

                        System.out.println("********Count : " + root.getPropertyCount());

                        value = new ArrayList<Detailinfo>();

                        for (int i = 0; i < root.getPropertyCount(); i++) {
                            SoapObject s_deals = (SoapObject) root.getProperty(i);
                            Detailinfo info = new Detailinfo();

                            info.setFirstName(s_deals.getProperty("Firstname").toString());
                            info.setLastName(s_deals.getProperty("Lastname").toString());
                            info.setDOB(s_deals.getProperty("DOB").toString());
                            info.setGender(s_deals.getProperty("Gender").toString());
                            info.setAddress(s_deals.getProperty("Address").toString());
                            info.setCity(s_deals.getProperty("City").toString());
                            info.setState(s_deals.getProperty("State").toString());
                            info.setPinecode(s_deals.getProperty("Pinecode").toString());
                            info.setMobile(s_deals.getProperty("Mobile").toString());
                            info.setEmail(s_deals.getProperty("Email").toString());
                            info.setBloodgroup(s_deals.getProperty("Bloodgroup").toString());
                            info.setAdddate(s_deals.getProperty("Adddate").toString());
                            info.setWaight(s_deals.getProperty("waight").toString());
                            value.add(info);
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    Intent intent = new Intent(getApplicationContext(), ComposeMail.class);
                    //intent.putParcelableArrayListExtra("valuesList", value);

                    startActivity(intent);
                }
            }).start();
        }
    });
 

22







Bu istisna, bu g├Ârevi yerine getirmek ├žok zaman al─▒yorsa, ana i┼č par├žac─▒─č─▒nda ger├žekle┼čtirilen herhangi bir a─č─▒r i┼č nedeniyle olu┼čur .

Bunu ├Ânlemek i├žin, biz kullanarak i┼čleyebilir konular─▒ veya bir uygulay─▒c─▒

 Executors.newSingleThreadExecutor().submit(new Runnable() {
    @Override
    public void run() {
        // You can perform your task here.
    }
});
 

21







Bu soruya zaten ├žok fazla b├╝y├╝k cevap var, ancak bu cevaplar─▒n yay─▒nlanmas─▒ndan bu yana bir├žok b├╝y├╝k kitapl─▒k ├ž─▒kt─▒. Bu bir t├╝r acemi-rehber olarak tasarlanm─▒┼čt─▒r.

A─č i┼člemlerini ger├žekle┼čtirmek i├žin ├že┼čitli kullan─▒m durumlar─▒n─▒ ve her biri i├žin bir veya iki ├ž├Âz├╝m├╝ ele alaca─č─▒m .

HTTP ├╝zerinden ReST

Genellikle Json, XML veya ba┼čka bir ┼čey olabilir

Tam API Eri┼čimi

Kullan─▒c─▒lar─▒n hisse senedi fiyatlar─▒n─▒, faiz oranlar─▒n─▒ ve cari d├Âviz kurlar─▒n─▒ takip etmelerini sa─člayan bir uygulama yazd─▒─č─▒n─▒z─▒ varsayal─▒m. Buna benzeyen bir Json API's─▒ bulursunuz:

 http://api.example.com/stocks                       //ResponseWrapper<String> object containing a list of Srings with ticker symbols
http://api.example.com/stocks/$symbol               //Stock object
http://api.example.com/stocks/$symbol/prices        //PriceHistory<Stock> object
http://api.example.com/currencies                   //ResponseWrapper<String> object containing a list of currency abbreviation
http://api.example.com/currencies/$currency         //Currency object
http://api.example.com/currencies/$id1/values/$id2  //PriceHistory<Currency> object comparing the prices of the first currency (id1) to the second (id2)
 

Meydandan G├╝├žlendirme

Bu, ├žoklu u├ž noktalara sahip bir API i├žin m├╝kemmel bir se├žimdir ve bunlar─▒ iyon veya Volley gibi di─čer k├╝t├╝phanelerde oldu─ču gibi ayr─▒ ayr─▒ kodlamak yerine ReST u├ž noktalar─▒n─▒ bildirmenizi sa─člar. (web sitesi: http://square.github.io/retrofit/ )

Mali API ile nas─▒l kullan─▒yorsunuz?

build.gradle

Bu sat─▒rlar─▒ Mod├╝l seviyenize buid.gradle ekleyin:

 implementation 'com.squareup.retrofit2:retrofit:2.3.0' //retrofit library, current as of September 21, 2017
implementation 'com.squareup.retrofit2:converter-gson:2.3.0' //gson serialization and deserialization support for retrofit, version must match retrofit version
 

FinancesApi.java

 public interface FinancesApi {
    @GET("stocks")
    Call<ResponseWrapper<String>> listStocks();
    @GET("stocks/{symbol}")
    Call<Stock> getStock(@Path("symbol")String tickerSymbol);
    @GET("stocks/{symbol}/prices")
    Call<PriceHistory<Stock>> getPriceHistory(@Path("symbol")String tickerSymbol);

    @GET("currencies")
    Call<ResponseWrapper<String>> listCurrencies();
    @GET("currencies/{symbol}")
    Call<Currency> getCurrency(@Path("symbol")String currencySymbol);
    @GET("currencies/{symbol}/values/{compare_symbol}")
    Call<PriceHistory<Currency>> getComparativeHistory(@Path("symbol")String currency, @Path("compare_symbol")String currencyToPriceAgainst);
}
 

FinancesApiBuilder

 public class FinancesApiBuilder {
    public static FinancesApi build(String baseUrl){
        return new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(FinancesApi.class);
    }
}
 

MaliyeFragment pasaj─▒

 FinancesApi api = FinancesApiBuilder.build("http://api.example.com/"); //trailing '/' required for predictable behavior
api.getStock("INTC").enqueue(new Callback<Stock>(){
    @Override
    public void onResponse(Call<Stock> stockCall, Response<Stock> stockResponse){
        Stock stock = stockCall.body();
        //do something with the stock
    }
    @Override
    public void onResponse(Call<Stock> stockCall, Throwable t){
        //something bad happened
    }
}
 

API'niz bir API Anahtar─▒ veya g├Ânderilecek bir kullan─▒c─▒ belirteci, vb. Gibi ba┼čka bir ba┼čl─▒k gerektiriyorsa, Retrofit bunu kolayla┼čt─▒r─▒r (ayr─▒nt─▒lar i├žin bu harika cevaba bak─▒n─▒z: https://stackoverflow.com/a/42899766/1024412 ).

Bir kerede ReST API eri┼čimi

Diyelim ki, kullan─▒c─▒lar─▒n GPS konumlar─▒n─▒ arayan ve o b├Âlgedeki mevcut s─▒cakl─▒─č─▒ kontrol eden ve onlara ruh halini s├Âyleyen bir "hava durumu" uygulamas─▒ olu┼čturdu─čunuzu varsayal─▒m. Bu t├╝r bir uygulaman─▒n, API biti┼č noktalar─▒ bildirmesi gerekmez; sadece bir API u├ž noktas─▒na eri┼čebilmek gerekiyor.

─░yon

Bu, bu eri┼čim t├╝r├╝ i├žin harika bir k├╝t├╝phanedir.

L├╝tfen msysmilu'in en iyi yan─▒t─▒n─▒ okuyun ( https://stackoverflow.com/a/28559884/1024412 )

G├Âr├╝nt├╝leri HTTP yoluyla y├╝kleme

Volley

Voleybolu ReST API'leri i├žin de kullan─▒labilir, ancak daha karma┼č─▒k kurulum nedeniyle, Retrofit'i Square'den yukar─▒daki gibi kullanmay─▒ tercih ederim ( http://square.github.io/retrofit/ )

Bir sosyal a─č uygulamas─▒ olu┼čturdu─čunuzu ve arkada┼člar─▒n─▒z─▒n profil resimlerini y├╝klemek istedi─činizi varsayal─▒m.

build.gradle

Bu sat─▒r─▒ Mod├╝l seviyenize buid.gradle ekleyin:

 implementation 'com.android.volley:volley:1.0.0'
 

ImageFetch.java

Voleybolu Retrofit'ten daha fazla kurulum gerektirir. Bir RequestQueue, ImageLoader ve ImageCache olu┼čturmak i├žin b├Âyle bir s─▒n─▒f olu┼čturman─▒z gerekecektir, ancak ├žok da k├Ât├╝ de─čil:

 public class ImageFetch {
    private static ImageLoader imageLoader = null;
    private static RequestQueue imageQueue = null;

    public static ImageLoader getImageLoader(Context ctx){
        if(imageLoader == null){
            if(imageQueue == null){
                imageQueue = Volley.newRequestQueue(ctx.getApplicationContext());
            }
            imageLoader = new ImageLoader(imageQueue, new ImageLoader.ImageCache() {
                Map<String, Bitmap> cache = new HashMap<String, Bitmap>();
                @Override
                public Bitmap getBitmap(String url) {
                    return cache.get(url);
                }
                @Override
                public void putBitmap(String url, Bitmap bitmap) {
                    cache.put(url, bitmap);
                }
            });
        }
        return imageLoader;
    }
}
 

user_view_dialog.xml

Resim eklemek i├žin mizanpaj xml dosyan─▒za a┼ča─č─▒dakileri ekleyin:

 <com.android.volley.toolbox.NetworkImageView
    android:id="@+id/profile_picture"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    app:srcCompat="@android:drawable/spinner_background"/>
 

UserViewDialog.java

OnCreate y├Ântemine (Fragment, Activity) veya yap─▒c─▒ya (Dialog) a┼ča─č─▒daki kodu ekleyin:

 NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
 

Picasso

Square'den bir ba┼čka m├╝kemmel k├╝t├╝phane. L├╝tfen baz─▒ harika ├Ârnekler i├žin siteye bak─▒n─▒z: http://square.github.io/picasso/


18







Basit bir deyi┼čle,

UI ─░PL─░─×─░NDE A─× ├çALI┼×MASI YAPMAYIN

├ľrne─čin, bir HTTP iste─či yaparsan─▒z, bu bir a─č i┼člemidir.

├ç├Âz├╝m:

  1. Yeni bir i┼č par├žac─▒─č─▒ olu┼čturmak zorundas─▒n
  2. Veya AsyncTask s─▒n─▒f─▒n─▒ kullan─▒nhttps://www.google.com.np/url%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26source%3Dweb%26cd%3D1%26cad%3Drja%26uact%3D8%26ved%3D0CB0QFjAAahUKEwjgivqS0-3GAhUGOJQKHV_YD84%26url%3Dhttp%253A%252F%252Fdeveloper.android.com%252Freference%252Fandroid%252Fos%252FAsyncTask.html%26ei%3DRfquVaDUPIbw0ATfsL_wDA%26usg%3DAFQjCNE8gLVXz1Hwq4rI8oxRkZNHjhRzpQ%26sig2%3DqTI0AgoyYUXyDwHFQup9sw

Yolu:

T├╝m ├žal─▒┼čmalar─▒n─▒ i├žeri koy

  1. run() yeni i┼č par├žac─▒─č─▒ y├Ântemi
  2. Veya doInBackground() AsyncTask s─▒n─▒f─▒n─▒n y├Ântemi.

Fakat:

A─č yan─▒t─▒ndan bir ┼čey ald─▒─č─▒n─▒zda ve bunu g├Âr├╝n├╝m├╝n├╝zde g├Âstermek istedi─činizde (TextView'deki ekran yan─▒t─▒ mesaj─▒ gibi), kullan─▒c─▒ aray├╝z├╝ne geri d├Ânmeniz gerekir .

E─čer yapmazsan, alacaks─▒n ViewRootImpl$CalledFromWrongThreadException .

Nas─▒l?

  1. AsyncTask kullan─▒rken, onPostExecute() y├Ântemi g├Âr├╝n├╝mden g├╝ncelleme
  2. Veya runOnUiThread() y├Ântemi ├ža─č─▒r─▒n ve y├Ântemin i├žindeki g├Âr├╝n├╝m├╝ g├╝ncelleyin run() .

16







Yukar─▒da b├╝y├╝k bir ├ž├Âz├╝m havuzu olmas─▒na ra─čmen kimse belirtilmedi com.koushikdutta.ion : https://github.com/koush/ion

Ayr─▒ca asenkron ve kullan─▒m─▒ ├žok basit :

 Ion.with(context)
.load("http://example.com/thing.json")
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
   @Override
    public void onCompleted(Exception e, JsonObject result) {
        // do stuff with the result or error
    }
});
 

10







Yeni Thread ve AsyncTask ├ž├Âz├╝mleri zaten a├ž─▒klanm─▒┼čt─▒r.

AsyncTask ideal olarak k─▒sa i┼člemler i├žin kullan─▒lmal─▒d─▒r. Normal Thread Android i├žin tercih edilmez.

HandlerThread ve Handler kullanarak alternatif ├ž├Âz├╝me g├Âz at─▒nhttps://developer.android.com/reference/android/os/Handler.html

HandlerThread

L├╝per olan yeni bir i┼č par├žac─▒─č─▒ ba┼člatmak i├žin kullan─▒┼čl─▒ bir s─▒n─▒f. Looper daha sonra i┼čleyici s─▒n─▒flar─▒ olu┼čturmak i├žin kullan─▒labilir. start() Hala aranmas─▒ gerekti─čini unutmay─▒n .

i┼čleyici:

─░┼čleyici, bir i┼č par├žac─▒─č─▒n─▒n MessageQueue ile ili┼čkilendirilmi┼č Message ve Runnable nesneleri g├Ândermenizi ve i┼člemenizi sa─člar. Her i┼čleyici ├Ârne─či, tek bir i┼č par├žac─▒─č─▒ ve bu i┼č par├žac─▒─č─▒n─▒n ileti kuyru─čuyla ili┼čkilendirilir. Yeni bir ─░┼čleyici olu┼čturdu─čunuzda, onu olu┼čturan i┼č par├žac─▒─č─▒n─▒n i┼č par├žac─▒─č─▒ / ileti kuyru─čuna ba─čl─▒d─▒r - bu noktadan itibaren, iletilerden ve ├žal─▒┼čt─▒r─▒labilir iletilerden iletiyi ├ž─▒kt─▒k├ža y├╝r├╝t├╝r ve y├╝r├╝t├╝r. S─▒ra.

├ç├Âz├╝m:

  1. yaratmak HandlerThread

  2. ├ça─čr─▒ start() ├╝zerine HandlerThread

  3. Create Handler alarak Looper gelen HanlerThread

  4. A─č i┼člemi ile ilgili kodunuzu Runnable nesneye yerle┼čtirin

  5. G├Ânder Runnable G├Ârevi Handler

├ľrnek kod pasaj─▒, hangi adres NetworkOnMainThreadException

 HandlerThread handlerThread = new HandlerThread("URLConnection");
handlerThread.start();
handler mainHandler = new Handler(handlerThread.getLooper());

Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        try {
            Log.d("Ravi", "Before IO call");
            URL page = new URL("http://www.google.com");
            StringBuffer text = new StringBuffer();
            HttpURLConnection conn = (HttpURLConnection) page.openConnection();
            conn.connect();
            InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
            BufferedReader buff = new BufferedReader(in);
            String line;
            while ( (line =  buff.readLine()) != null) {
                text.append(line + "\n");
            }
            Log.d("Ravi", "After IO call");
            Log.d("Ravi",text.toString());

        }catch( Exception err){
            err.printStackTrace();
        }
    }
};
mainHandler.post(myRunnable);
 

Bu yakla┼č─▒m─▒ kullanman─▒n art─▒lar─▒:

  1. Thread/AsyncTask Her a─č i┼člemi i├žin yeni olu┼čturmak pahal─▒d─▒r. Bir Thread/AsyncTask sonraki A─č operasyonlar─▒ i├žin imha edilecek ve yeniden olu┼čturulacak. Ancak Handler ve HandlerThread yakla┼č─▒rken, HandlerThread kullanarak tek bir ├žok a─č i┼člemi (├çal─▒┼čt─▒r─▒labilir g├Ârevler olarak) g├Ânderebilirsiniz Handler .

10







ANR , NetworkOnMainThreadException , IllegalStateException'─▒ bo┼čaltmak main thread ve bunlardan ka├ž─▒nmak i├žin kodunuzun bir b├Âl├╝m├╝n├╝ ba┼čka bir i┼č par├žac─▒─č─▒na ta┼č─▒yabilirsiniz (├Ârn., Kullan─▒c─▒ arabirimini uzun s├╝re boyunca potansiyel olarak kilitleyebilece─či i├žin ana i┼č par├žas─▒ndaki veritaban─▒na eri┼čilemiyor). https://developer.android.com/topic/performance/vitals/anr.htmlhttps://developer.android.com/reference/android/os/NetworkOnMainThreadException.htmlhttps://developer.android.com/reference/java/lang/IllegalStateException.html

Duruma g├Âre se├žmeniz gereken baz─▒ yakla┼č─▒mlar var.

Java i┼č par├žac─▒─č─▒ veya Android i┼čleyicisi

Java i┼č par├žac─▒klar─▒ yaln─▒zca bir defal─▒k kullan─▒md─▒r ve ├žal─▒┼čma y├Ântemini y├╝r├╝tt├╝kten sonra ├Âl├╝r.

HandlerThread, ilmek yap─▒c─▒ olan yeni bir konu ba┼člatmak i├žin kullan─▒┼čl─▒ bir s─▒n─▒ft─▒r.

AsyncTask

AsyncTask , Thread ve Handler ├ževresinde yard─▒mc─▒ bir s─▒n─▒f olarak tasarlanm─▒┼čt─▒r ve genel bir di┼č a├žma ├žer├ževesi olu┼čturmaz. AsyncTasks, k─▒sa i┼člemler i├žin ideal olarak kullan─▒lmal─▒d─▒r (en fazla birka├ž saniye). ─░plikleri uzun s├╝re ├žal─▒┼č─▒r durumda tutmaya ihtiyac─▒n─▒z varsa, java.util.concurrent paketi taraf─▒ndan sa─članan ├že┼čitli API'leri kullanman─▒z ├Ânemle tavsiye edilir. Y├╝r├╝t├╝c├╝ , ThreadPoolExecutor ve FutureTask .

─░┼č par├žac─▒─č─▒ havuzu uygulamas─▒ ThreadPoolExecutor , ScheduledThreadPoolExecutor ...

─░┼č par├žac─▒─č─▒ havuzu ├╝zerinde iyi kontrol sa─člayan ExecutorService uygulayan ThreadPoolExecutor s─▒n─▒f─▒ (├Ârne─čin, ├žekirdek havuz boyutu, maksimum havuz boyutu, hayatta kalma s├╝resi vb.)

ScheduledThreadPoolExecutor - ThreadPoolExecutor ├Â─česini geni┼čleten bir s─▒n─▒f. Belirli bir gecikmeden sonra veya d├╝zenli aral─▒klarla g├Ârevler zamanlayabilir.

FutureTask

FutureTask e┼čzamans─▒z i┼člem yapar, ancak sonu├ž hen├╝z haz─▒r de─čilse veya i┼člem tamamlanmad─▒ysa, get () i┼člevinin ├ža─čr─▒lmas─▒ i┼č par├žac─▒─č─▒n─▒ engeller

AsyncTaskLoaders

AsyncTaskLoaders, AsyncTask'a ├Âzg├╝ bir├žok sorunu ├ž├Âzd├╝k├že

IntentService

Bu, Android'de uzun s├╝redir devam eden i┼člemlerin defacto tercihidir, iyi bir ├Ârnek, b├╝y├╝k dosyalar─▒ y├╝klemek veya indirmek olabilir. Kullan─▒c─▒ uygulamadan ├ž─▒ksa bile y├╝kleme ve indirme i┼člemi devam edebilir ve bu g├Ârevler devam ederken kullan─▒c─▒n─▒n uygulamay─▒ kullanmas─▒n─▒ kesinlikle engellemek istemezsiniz.

JobScheduler

Etkili bir ┼čekilde, bir Hizmet olu┼čturman─▒z ve hizmeti ne zaman ├žal─▒┼čt─▒rman─▒z gerekti─čine ili┼čkin kriterlerinizi belirten JobInfo.Builder'─▒ kullanarak bir i┼č olu┼čturman─▒z gerekir.

RxJava

G├Âzlenebilir dizileri kullanarak zaman uyumsuz ve olaya dayal─▒ programlar─▒ olu┼čturmak i├žin k├╝t├╝phane.

Coroutines (Kotlin)

Bunun as─▒l ├Âz├╝, e┼čzamans─▒z kodun e┼čzamanl─▒ gibi g├Âr├╝nmesini sa─člar

Daha fazla burada , burada , burada , burada okuyun


10







RxAndroid bu soruna ba┼čka daha iyi bir alternatif ve bizi i┼č par├žac─▒─č─▒ yaratma ve Android UI i┼č par├žac─▒─č─▒ ├╝zerine sonu├žlar─▒ g├Ânderme zahmetinden kurtar─▒yor. Sadece hangi g├Ârevlerin yerine getirilmesi gerekti─čini ve her ┼čeyin dahili olarak ele al─▒nmas─▒ gerekti─čini belirtmemiz gerekiyor.

 Observable<List<String>> musicShowsObservable = Observable.fromCallable(new Callable<List<String>>() { 

  @Override 
  public List<String> call() { 
    return mRestClient.getFavoriteMusicShows(); 
  }
});

mMusicShowSubscription = musicShowsObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {

    @Override 
    public void onCompleted() { }

    @Override 
    public void onError(Throwable e) { }

    @Override 
    public void onNext(List<String> musicShows){
        listMusicShows(musicShows);
    }
});
 
  1. Specifiying g├Âre (Schedulers.io()) , RxAndroid ├žal─▒┼čacak getFavoriteMusicShows() farkl─▒ bir i┼č par├žac─▒─č─▒ ├╝zerinde.

  2. Kullanarak AndroidSchedulers.mainThread() UI i┼č par├žac─▒─č─▒nda bu G├Âzlemlenebilir'i g├Âzlemlemek istiyoruz, yani onNext() geri arama i┼člemimizin UI i┼č par├žac─▒─č─▒nda ├ža─čr─▒lmas─▒n─▒ istiyoruz.


8







Bu ├žal─▒┼č─▒yor. Az ├Ânce Dr. Luji'nin cevab─▒n─▒ biraz daha basitle┼čtirdi.

 new Thread() {
    @Override
    public void run() {
        try {
            //Your code goes here
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}.start();
 

7


2015-02-13





Android'de a─č i┼člemleri ana i┼č par├žac─▒─č─▒nda ├žal─▒┼čt─▒r─▒lamaz. A─č i┼člemlerini yapmak i├žin Thread, AsyncTask (k─▒sa s├╝reli g├Ârevler), Servis (uzun s├╝reli g├Ârevler) kullanabilirsiniz.


7







A─č kaynaklar─▒na ana (UI) i┼č par├žac─▒─č─▒ndan eri┼čmek bu istisnaya neden olur. Bu sorunu ├Ânlemek i├žin bir a─č kayna─č─▒na eri┼čmek i├žin ayr─▒ bir i┼č par├žac─▒─č─▒ veya AsyncTask kullan─▒n.


7







Bu sorunun ├╝stesinden gelmek i├žin ├žok uygun bir yol daha var - rxJava'n─▒n e┼čzamanl─▒l─▒k yeteneklerini kullan─▒n. Herhangi bir g├Ârevi arka planda y├╝r├╝tebilir ve sonu├žlar─▒ ana i┼č par├žac─▒─č─▒na ├žok uygun bir ┼čekilde g├Ânderebilirsiniz, b├Âylece bu sonu├žlar i┼čleme zincirine verilir.

Do─črulanm─▒┼č ilk cevap ├Ânerisi AsynTask kullanmakt─▒r. Evet, bu bir ├ž├Âz├╝m, ancak bug├╝nlerde modas─▒ ge├žmi┼č, ├ž├╝nk├╝ ├ževresinde yeni ara├žlar var.

 String getUrl() {
    return "SomeUrl";
}

private Object makeCallParseResponse(String url) {
    return null;
    //
}

private void processResponse(Object o) {

}
 

GetUrl y├Ântemi URL adresini sa─člar ve ana i┼č par├žac─▒─č─▒nda y├╝r├╝t├╝l├╝r.

makeCallParseResponse (..) - fiili ├žal─▒┼čma yapar

processResponse (..) - ana i┼č par├žac─▒─č─▒ndaki sonucu ele al─▒r.

E┼čzamans─▒z ├žal─▒┼čt─▒rma kodu ┼č├Âyle g├Âr├╝necektir:

 rx.Observable.defer(new Func0<rx.Observable<String>>() {
    @Override
    public rx.Observable<String> call() {
        return rx.Observable.just(getUrl());
    }
})
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.io())
    .map(new Func1<String, Object>() {
        @Override
        public Object call(final String s) {
            return makeCallParseResponse(s);
        }
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Object>() {
        @Override
        public void call(Object o) {
             processResponse(o);
        }
    },
    new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {
            // Process error here, it will be posted on
            // the main thread
        }
    });
 

AsyncTask ile kar┼č─▒la┼čt─▒r─▒ld─▒─č─▒nda, bu y├Ântem zamanlay─▒c─▒lar─▒ iste─če ba─čl─▒ say─▒da de─či┼čtirmenize izin verir (├Ârne─čin, bir zamanlay─▒c─▒dan veri al ve bu verileri ba┼čka bir zamana i┼čle (├Ârne─čin, Scheduler.computation ()). Kendi zamanlay─▒c─▒lar─▒n─▒z─▒ tan─▒mlayabilirsiniz.

Bu k├╝t├╝phaneyi kullanmak i├žin, build.gradle dosyas─▒na a┼ča─č─▒daki sat─▒rlar─▒ ekleyin:

    compile 'io.reactivex:rxjava:1.1.5'
   compile 'io.reactivex:rxandroid:1.2.0'
 

Son ba─č─▒ml─▒l─▒k, .mainThread () zamanlay─▒c─▒ i├žin destek i├žerir.

Orada rx-java i├žin m├╝kemmel bir e-kitap .


7