java আমি কিভাবে android.os.NetworkOnMainThreadException ঠিক করব?




15 Answers

আপনি প্রায় সবসময় একটি থ্রেড বা একটি অ্যাসিঙ্ক্রোনাস টাস্ক উপর নেটওয়ার্ক অপারেশন চালানো উচিত।

তবে এই সীমাবদ্ধতাটি সরিয়ে ফেলা সম্ভব এবং আপনি যদি ডিফল্ট আচরণগুলি মুছে ফেলতে চান তবে আপনি ফলাফলগুলি গ্রহণ করতে ইচ্ছুক।

যোগ করুন

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

StrictMode.setThreadPolicy(policy); 

আপনার ক্লাসে,

এবং

Android manifest.xml ফাইলটিতে এই অনুমতিটি যোগ করুন:

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

ফল:

আপনার অ্যাপ্লিকেশনটি (স্পট ইন্টারনেট সংযোগের ক্ষেত্রে) প্রতিক্রিয়াশীল এবং লক আপ হয়ে যাবে, ব্যবহারকারীটি হতাশা অনুভব করে এবং তাকে একটি বল মারতে হবে এবং আপনি কার্যকলাপ ম্যানেজারকে আপনার অ্যাপ্লিকেশনটি মারতে এবং ব্যবহারকারীকে বলে যে অ্যাপ্লিকেশনটি বন্ধ করে দিয়েছে তা ঝুঁকিপূর্ণ।

প্রতিক্রিয়াশীলতার জন্য ডিজাইন করার জন্য Android এর কিছু ভাল টিপস রয়েছে: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

java android networkonmainthread thread-exceptions

RssReader এর জন্য আমার Android প্রকল্প চালানোর সময় একটি ত্রুটি ঘটেছে।

কোড:

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

এবং এটি নিচের ত্রুটিটি দেখায়:

android.os.NetworkOnMainThreadException

আমি কিভাবে এই সমস্যা ঠিক করতে পারি?




আপনি Honeycomb এ UI থ্রেডে নেটওয়ার্ক I/O সম্পাদন করতে পারবেন না। টেকনিক্যালি, এটি Android এর পূর্ববর্তী সংস্করণগুলিতে সম্ভব, তবে এটি একটি খারাপ ধারণা, কারণ এটি আপনার অ্যাপ্লিকেশনকে প্রতিক্রিয়া বন্ধ করে দেবে এবং এর ফলে OS এর খারাপ আচরণের জন্য আপনার অ্যাপ্লিকেশনটিকে হত্যা করা হতে পারে। ব্যাকগ্রাউন্ড থ্রেডে আপনার নেটওয়ার্ক লেনদেন সম্পাদন করতে আপনাকে একটি ব্যাকগ্রাউন্ড প্রক্রিয়া চালানো বা AsyncTask ব্যবহার করতে হবে।

অ্যান্ড্রয়েড বিকাশকারী সাইটটিতে বেহালা থ্রেডিং সম্পর্কে একটি নিবন্ধ রয়েছে যা এটির একটি ভাল ভূমিকা, এবং এটি আপনাকে এখানে সরবরাহ করা যেতে পারে এমন একটি উত্তরের অনেক গভীর গভীরতা সরবরাহ করবে।




  1. কঠোর মোড ব্যবহার করবেন না (শুধুমাত্র ডিবাগ মোডে)
  2. এসডিকে সংস্করণ পরিবর্তন করবেন না
  3. একটি পৃথক থ্রেড ব্যবহার করবেন না

পরিষেবা বা AsyncTask ব্যবহার করুন

স্ট্যাক ওভারফ্লো প্রশ্নটি দেখুন:

android.os.NetworkOnMainThreadException Android থেকে একটি ইমেল পাঠানো




আপনি নিম্নলিখিত কোড ব্যবহার করে কঠোর মোড নিষ্ক্রিয় করুন:

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

এটি সুপারিশ করা হয় না : AsyncTask ইন্টারফেসটি ব্যবহার করুন।

উভয় পদ্ধতির জন্য সম্পূর্ণ কোড




ভিতরে আপনার কোড রাখুন:

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

বা:

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



এটি অ্যান্ড্রয়েড 3.0 এবং তারপরেও ঘটে। অ্যান্ড্রয়েড 3.0 এবং তার উপরে থেকে, তারা মূল থ্রেড / UI থ্রেডে চলমান নেটওয়ার্ক ক্রিয়াকলাপ (ইন্টারনেট অ্যাক্সেসের ফাংশনগুলি) ব্যবহার করে সীমাবদ্ধ করেছে (আপনার তৈরি এবং ক্রিয়াকলাপে সারসংকলনের পদ্ধতিগুলিতে কীগুলি ফুটে উঠেছে)।

এটি নেটওয়ার্ক অপারেশনের জন্য পৃথক থ্রেড ব্যবহার করে উত্সাহিত করা হয়। নেটওয়ার্ক ক্রিয়াকলাপগুলি কীভাবে সঠিকভাবে সম্পাদন করবেন সে সম্পর্কে আরো বিস্তারিত জানার জন্য AsyncTask দেখুন।




Spektom শীর্ষ উত্তর নিখুঁত কাজ করে।

যদি আপনি AsyncTask লেখেন এবং AsyncTask শ্রেণী হিসাবে প্রসারিত না হন এবং AsyncTask উপরে, যদি AsyncTask থেকে প্রতিক্রিয়া পাওয়ার প্রয়োজন হয় তবে একজন নীচের get() পদ্ধতিটি ব্যবহার করতে পারেন।

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

(তার উদাহরণ থেকে।)




এটি শুধুমাত্র Honeycomb SDK বা উচ্চতর লক্ষ্যমাত্রার জন্য অ্যাপ্লিকেশনের জন্য নিক্ষিপ্ত হয়। আগে এসডিকে সংস্করণগুলিকে লক্ষ্য করে অ্যাপ্লিকেশনগুলি তাদের প্রধান ইভেন্ট লুপ থ্রেডগুলিতে নেটওয়ার্কিং করার অনুমতি দেয়।

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html




স্পষ্টভাবে কিছু বানান শুধু:

মূল থ্রেড মূলত ইউআই থ্রেড হয়।

সুতরাং আপনি প্রধান থ্রেডে নেটওয়ার্কিং ক্রিয়াকলাপগুলি করতে পারবেন না বলে আপনি ইউআই থ্রেডে নেটওয়ার্কিং ক্রিয়াকলাপগুলি করতে পারবেন না , যার মানে আপনি *runOnUiThread(new Runnable() { ... }* অন্য কোন থ্রেডে ব্লক নেটওয়ার্কিং অপারেশন করতে পারবেন না। , হয়।

(আমি শুধু আমার মাথা থেকে অন্য কোথাও যে ত্রুটি খুঁজে পেয়েছিলাম কেন খুঁজে বের করার চেষ্টা করা একটি দীর্ঘ মাথা-scratching মুহূর্ত ছিল। এই কারণে, এই থ্রেড সাহায্য করেছে এবং আশা করি এই মন্তব্য অন্য কেউ সাহায্য করবে।)




    **Use like this in Your Activity**

    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 inten=new Intent(getApplicationContext(),ComposeMail.class);
            //intent.putParcelableArrayListExtra("valuesList", value);

            startActivity(inten);



                }
            }).start();
        }
    });



ইতিমধ্যে এই প্রশ্নের উপর অনেক মহান উত্তর আছে, কিন্তু সেই উত্তরগুলি পোস্ট করার পরে অনেকগুলি দুর্দান্ত লাইব্রেরি এসেছে। এটি একটি ধরনের নবাগত গাইড হিসাবে উদ্দেশ্যে করা হয়।

আমি নেটওয়ার্ক অপারেশন সম্পাদন এবং প্রতিটি জন্য একটি সমাধান বা দুটি জন্য বিভিন্ন ব্যবহারের ক্ষেত্রে আবরণ হবে।

HTTP উপর পুনঃস্থাপন

সাধারণত জসন, এক্সএমএল বা অন্য কিছু হতে পারে

সম্পূর্ণ API অ্যাক্সেস

ধরুন আপনি একটি অ্যাপ্লিকেশন লিখছেন যা ব্যবহারকারীদের স্টক মূল্য, সুদের হার এবং কারেন্সি বিনিময় হারগুলি ট্র্যাক করতে দেয়। আপনি একটি জসন API খুঁজে পাবেন যা এইরকম কিছু দেখায়:

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)

স্কয়ার থেকে retrofit

এটি একাধিক এন্ডপয়েন্টের সাথে একটি API এর জন্য একটি চমৎকার পছন্দ এবং আপনাকে আয়ন বা ভলি মত অন্যান্য লাইব্রেরিগুলির মতো পৃথকভাবে কোড করার পরিবর্তে REST এন্ডপয়েন্টগুলি ঘোষণা করার অনুমতি দেয়। (ওয়েবসাইট: http://square.github.io/retrofit/ )

আপনি কিভাবে আর্থিক API এ এটি ব্যবহার করবেন?

build.gradle

আপনার মডিউল স্তর buid.gradle এ এই লাইন যোগ করুন:

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

FinancesFragment স্নিপেট

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 এ যদি API টোকেন বা ব্যবহারকারী টোকেন ইত্যাদি প্রেরণের মতো অন্য শিরোনাম পাঠানো প্রয়োজন তবে Retrofit এটিকে সহজ করে তোলে (বিস্তারিত জানার জন্য এই দুর্দান্ত উত্তরটি দেখুন: https://.com/a/42899766/1024412 )।

রিস্ট API এ অ্যাক্সেস বন্ধ

ধরুন আপনি একটি "মেজাজ আবহাওয়া" অ্যাপ্লিকেশন তৈরি করছেন যা ব্যবহারকারীদের GPS অবস্থানটি দেখায় এবং সেই অঞ্চলে বর্তমান তাপমাত্রা পরীক্ষা করে এবং তাদের মেজাজ বলে। এই ধরনের অ্যাপটি API এপয়েন্ট পয়েন্ট ঘোষণা করার প্রয়োজন নেই; এটি শুধুমাত্র একটি API এপয়েন্ট পয়েন্ট অ্যাক্সেস করতে সক্ষম হতে হবে।

স্থূলাণু

এই অ্যাক্সেসের এই ধরনের জন্য একটি মহান লাইব্রেরি।

Msysmilu এর দুর্দান্ত উত্তর অনুগ্রহ করে পড়ুন ( https://.com/a/28559884/1024412 )

HTTP মাধ্যমে ইমেজ লোড করুন

নিক্ষেপ

ভলিটি রিস্ট API এও ব্যবহার করা যেতে পারে, তবে আরো জটিল সেটআপের কারণে আমি উপরে বর্ণিত স্কোয়ার থেকে Retrofit ব্যবহার করতে পছন্দ করি ( http://square.github.io/retrofit/ )

চলুন আপনি একটি সামাজিক নেটওয়ার্কিং অ্যাপ্লিকেশন তৈরি করছেন এবং বন্ধুদের প্রোফাইল ছবি লোড করতে চান।

build.gradle

আপনার মডিউল স্তরের buid.gradle এ এই লাইনটি যোগ করুন:

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

ImageFetch.java

Volley Retrofit চেয়ে আরো সেটআপ প্রয়োজন। আপনি একটি RequestQueue, একটি ImageLoader এবং একটি ImageCache সেট আপ করার জন্য এটির মতো একটি ক্লাস তৈরি করতে হবে, কিন্তু এটি খুব খারাপ নয়:

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

একটি ছবি যোগ করার জন্য আপনার লেআউট xml ফাইলটিতে নিম্নলিখিতটি জুড়ুন:

<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

নিচের কোডটি অনক্রিট পদ্ধতিতে (ফ্র্যাগমেন্ট, ক্রিয়াকলাপ) বা কন্সট্রাকটর (ডায়ালগ) যুক্ত করুন:

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

পিকাসো

স্কয়ার থেকে আরেকটি চমৎকার লাইব্রেরি। কিছু দুর্দান্ত উদাহরণের জন্য সাইটটি দেখুন: http://square.github.io/picasso/




এইটা কাজ করে. শুধু ড। লুইজি এর উত্তরটা একটু সহজ করে তুলেছে।

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



প্রধান (UI) থ্রেড থেকে নেটওয়ার্ক সংস্থান অ্যাক্সেস করার ফলে এই ব্যতিক্রমটি ঘটে। এই সমস্যা এড়ানোর জন্য একটি নেটওয়ার্ক রিসোর্স অ্যাক্সেস করার জন্য একটি পৃথক থ্রেড বা AsyncTask ব্যবহার করুন।




নতুন Threadএবং AsynTask সমাধান ইতিমধ্যে ব্যাখ্যা করা হয়েছে।

AsyncTaskআদর্শভাবে ছোট অপারেশন জন্য ব্যবহার করা উচিত। সাধারণ ThreadAndroid এর জন্য পছন্দসই নয়।

HandlerHandlerThread এবং Handler ব্যবহার করে বিকল্প সমাধানটি দেখুনHandler

HandlerThread

একটি looper আছে যে একটি নতুন থ্রেড শুরু করার জন্য হ্যান্ডি ক্লাস। Looper তারপর হ্যান্ডলার ক্লাস তৈরি করতে ব্যবহার করা যেতে পারে। উল্লেখ্য যে start()এখনও বলা উচিত।

হ্যান্ডলার সঠিক নয়:

একটি হ্যান্ডলার আপনাকে একটি থ্রেড এর MessageQueue সম্পর্কিত বার্তা এবং চালযোগ্য বস্তুগুলি প্রেরণ এবং প্রক্রিয়া করতে দেয়। প্রতিটি হ্যান্ডলার উদাহরণটি একটি একক থ্রেড এবং সেই থ্রেডের বার্তা সারির সাথে যুক্ত। যখন আপনি একটি নতুন হ্যান্ডলার তৈরি করেন, তখন এটি তৈরি করে এমন থ্রেডের বার্তা / থ্রেডের সাথে আবদ্ধ থাকে - যে দিক থেকে এটি বার্তা বার্তা এবং রানেনবেলগুলিকে সেই বার্তা সারিতে বিতরণ করবে এবং বার্তাটি থেকে বেরিয়ে আসার পরে তাদের চালানো হবে। কিউ.

সমাধান:

  1. সৃষ্টি HandlerThread

  2. কল start()করুনHandlerThread

  3. থেকে Handlerপেয়ে তৈরি করুনLooperHanlerThread

  4. Runnableবস্তুর মধ্যে আপনার নেটওয়ার্ক অপারেশন সম্পর্কিত কোড এমবেড করুন

  5. Runnableটাস্ক জমা দিনHandler

নমুনা কোড স্নিপেট, যা ঠিকানা 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);

এই পদ্ধতি ব্যবহার করে পেশাদার:

  1. Thread/AsyncTaskপ্রতিটি নেটওয়ার্ক অপারেশন জন্য নতুন নির্মাণ ব্যয়বহুল। Thread/AsyncTaskধ্বংস হয়ে যাবে এবং পরবর্তী নেটওয়ার্ক অপারেশন জন্য পুনরায় সৃষ্টি করেছেন। কিন্তু HandlerHandlerThreadপদ্ধতির, আপনি অনেক নেটওয়ার্কের কার্যকলাপ (যেমন runnable কর্ম) একক জমা দিতে পারেন HandlerThreadব্যবহার করে Handler



এই সমস্যাটি মোকাবেলা করার জন্য আরেকটি সুবিধাজনক উপায় রয়েছে - RxJava এর সমতুল্য ক্ষমতাগুলি ব্যবহার করুন। আপনি ব্যাকগ্রাউন্ডে যে কোনও কার্য কার্যকর করতে পারেন এবং খুব সহজেই প্রধান থ্রেডে ফলাফল পোস্ট করতে পারেন, তাই এই ফলাফলগুলি প্রসেসিং চেইনটিতে হস্তান্তর করা হবে।

প্রথম যাচাই উত্তর পরামর্শ AsynTask ব্যবহার করা হয়। হ্যাঁ, এটি একটি সমাধান, তবে এটি আজকাল অপ্রচলিত, কারণ সেখানে নতুন সরঞ্জাম রয়েছে।

String getUrl() {
    return "SomeUrl";
}

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

private void processResponse(Object o) {

}

GetUrl পদ্ধতিটি URL ঠিকানা সরবরাহ করে এবং এটি মূল থ্রেডে কার্যকর হবে।

MakeCarseResponse (..) - প্রকৃত কাজ করে

processresponse (..) - প্রধান থ্রেড ফলাফল হ্যান্ডেল হবে।

অ্যাসিঙ্ক্রোনাস নির্বাহের জন্য কোডটি দেখতে হবে:

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 এর তুলনায়, এই পদ্ধতিটি নির্ধারিত সময়সূচীগুলিকে একটি ইচ্ছাকৃতভাবে স্যুইচ করতে অনুমতি দেয় (বলুন, একটি সময়সূচীর উপর ডেটা আনুন এবং অন্য যে তথ্যটি প্রক্রিয়া করুন (বলুন, Scheduler.computation ())। এছাড়াও আপনি নির্ধারণকারী নির্ধারণ করতে পারেন।

এই লাইব্রেরিটি ব্যবহার করার জন্য, build.gradle ফাইলটিতে আপনার নিম্নলিখিত লাইনগুলি অন্তর্ভুক্ত করুন:

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

সর্বশেষ নির্ভরতাটি .mainThread () সময়সূচীর জন্য সমর্থন অন্তর্ভুক্ত করে।

নেই RX জাভা জন্য একটি চমৎকার ইসলাম




Related