বাংলায় অ্যান্ড্রয়েড সহায়িকা - Bangla Android Guide

সিঙ্ক অ্যাডডাপটর রান করা যখন কনটেন্ট প্রভাইডার ডাটা পরিবর্তন করে

যদি আপনার অ্যাপ একটি কনটেন্ট প্রভাইডারের মধ্যে ডাটা সংগ্রহ করে, এবং আপনি সার্ভার আপডেট করতে চান, যখনই আপনি প্রভাইডার আপডেট করেন, আপনি আপনার সিঙ্ক অ্যাডাপটর স্বয়ংক্রিয়ভাবে রান করতে আপনার অ্যাপ সেটআপ করতে পারেন। এটা করতে কনটন্টে প্রভাইডারের জন্য আপনি একটি অবজার্ভার রেজিস্টার করেন। যখন আপনার কনটেন্ট প্রভাইডারের ডাটা পরিবর্তন করে, কনটেন্ট প্রভাইডার ফ্রেমওয়ার্ক অবজার্ভার কল করে। অবজার্ভারের মধ্যে ফ্রেমওয়ার্ক কে আপনার সিঙ্ক অ্যাডাপটর রান করতে বলতে requestSync()কল করুন।

নোট: যদি আপনি স্টাব কনটেন্ট প্রভাইডার ব্যবহার করেন, কনটেন্ট প্রভাইডারে আপনার কোন ডাটা নাই এবং onChange()কে কখনই কল করা হয় না। এই ক্ষেত্রে, ডিভাইস ডাটাতে পরিবর্তন চিহ্নিত করতে আপনার নিজস্ব প্রক্রিয়া (মেকানিজম) প্রদাান করতে হবে। এই প্রক্রিয়া requestSync()কল করার জন্য দায়িত্বপ্রাপ্ত যখন ডাটা পরিবর্তন করে।

আপনার কনটেন্ট প্রভাইডারের জন্য একটি অবজার্ভার তৈরী করতে, ক্লাস ContentObserver প্রসারিত করুন এবং এর onChange()পদ্ধতির উভয় রূপই বাস্তবায়ন করুন। onChange()এর মধ্যে, সিঙ্ক অ্যাডাপটর শুরু করতে requestSync()কল করুন।

অবজার্ভার রেজিস্টার করতে, registerContentObserver()এ একটি কলের মধ্যে একটি আর্গুমেন্ট হিসাবে এটাকে পাস করুন। এই কলে, আপনি যে ডাটা দেখতে চান তার জন্য একটি কনটেন্ট URI এ আপনাকে পাস করতে হবে। কনটেন্ট প্রভাইডার ফ্রেমওয়ার্কটি এই ওয়াচ URI কে কনটেন্ট URI এ তুলনা করে যা ContentResolver পদ্ধতিতে আর্গুমন্টে হিসাবে পাস হয়েছে যা আপনার প্রভাইডার পরিমিত করে, যেমন, ContentResolver.insert()। যদি সেখানে কোন সমরূপ কিছু থাকে, আপনার ContentObserver.onChange()এর বাস্তবায়ন কে কল করা হয়।

নিচের কোড চিত্রটি দেখাচ্ছে যে কীভাবে আপনি একটি ContentObserver নির্ধারণ করবেন যা requestSync()কল করে যখন একটি টেবিল পরিবর্তন করে:

public class MainActivity extends FragmentActivity {
    ...
    // Constants
    // Content provider scheme
    public static final String SCHEME = "content://";
    // Content provider authority
    public static final String AUTHORITY = "com.example.android.datasync.provider";
    // Path for the content provider table
    public static final String TABLE_PATH = "data_table";
    // Account
    public static final String ACCOUNT = "default_account";
    // Global variables
    // A content URI for the content provider's data table
    Uri mUri;
    // A content resolver for accessing the provider
    ContentResolver mResolver;
    ...
    public class TableObserver extends ContentObserver {
        /*
         * Define a method that's called when data in the
         * observed content provider changes.
         * This method signature is provided for compatibility with
         * older platforms.
         */
        @Override
        public void onChange(boolean selfChange) {
            /*
             * Invoke the method signature available as of
             * Android platform version 4.1, with a null URI.
             */
            onChange(selfChange, null);
        }
        /*
         * Define a method that's called when data in the
         * observed content provider changes.
         */
        @Override
        public void onChange(boolean selfChange, Uri changeUri) {
            /*
             * Ask the framework to run your sync adapter.
             * To maintain backward compatibility, assume that
             * changeUri is null.
            ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);
        }
        ...
    }
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // Get the content resolver object for your app
        mResolver = getContentResolver();
        // Construct a URI that points to the content provider data table
        mUri = new Uri.Builder()
                  .scheme(SCHEME)
                  .authority(AUTHORITY)
                  .path(TABLE_PATH)
                  .build();
        /*
         * Create a content observer object.
         * Its code does not mutate the provider, so set
         * selfChange to "false"
         */
        TableObserver observer = new TableObserver(false);
        /*
         * Register the observer for the data table. The table's path
         * and any of its subpaths trigger the observer.
         */
        mResolver.registerContentObserver(mUri, true, observer);
        ...
    }
    ...
}