একাধিক লোডার সহ লোডারম্যানেজার: কীভাবে সঠিক কার্সরলোডার পাবেন


116

আমার কাছে এটি পরিষ্কার নয় যে আপনার যদি একাধিক লোডার থাকে তবে কীভাবে সঠিক কার্সার পাবেন। আপনাকে দুটি পৃথক লোডার সংজ্ঞায়িত করতে বলুন:

getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);

তারপরে onCreateLoader () এ আপনি আইডির উপর নির্ভর করে বিভিন্ন জিনিস করেন:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 

এ পর্যন্ত সব ঠিকই. তবে কীভাবে সঠিকভাবে কার্সারটি অললডফিনিশড () এ পাবেন কারণ আপনি সঠিক কার্সরডাপ্টারের জন্য সঠিক কার্সার সনাক্ত করতে কোনও আইডি পান না।

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2

বা আমি কি ভুল এবং এক খণ্ডে দুটি পৃথক কার্সরডাপ্টারের ফলাফল পাওয়ার জন্য এটিই ভুল উপায়।


এই সত্যিই একটি ভাল প্রশ্ন! এটি বেশ ভালভাবে জিজ্ঞাসা করা হয়েছে, এবং মোটামুটি অল্পবিস্তর বিষয়ে স্পর্শ করে। খুব নির্দিষ্ট।
কুর্টিস নসবাউম

7
এটা তোলে উল্লেখ করা উচিত আপনি যে আছে পৃথক হ্যান্ডলার শ্রেণীর ব্যবহার করতে, জাভা আপনি একটি ইন্টারফেস (বাস্তবায়ন করার অনুমতি দেয় না যখনই লোডার রিটার্ন টাইপ সব লোডার জুড়ে একই জেনেরিক টাইপ ইরেজিওর কারণে যেহেতু LoaderCallbacksএকাধিক সঙ্গে এই ক্ষেত্রে) টাইপ করুন। এটি কেবলমাত্র আপনার ক্ষেত্রে উভয় সময় থেকেই কাজ করে, ফলাফলটি একটি Cursor
ম্যাথিয়াস

1
@ মাথিয়াস দুর্দান্ত আপনি এটির উল্লেখ করতেন! আমি কেবল ভিন্ন ভিন্ন রিটার্ন সহ 2 লোডার রাখার বিষয়টি বিবেচনা করছি। সুতরাং যদি 2 ভিন্ন ভিন্ন রিটার্ন টাইপ সহ 2 লোডার? 1 টি লোডার দিয়ে একটি কাজ, অন্যটির পরিবর্তে থ্রেড সহ কী?
রবার্ট

@ রবার্ট থ্রেড ব্যবহার করার প্রয়োজন নেই। আপনি দুটি Loaderএস ব্যবহার করতে পারেন । দয়া করে এই মধ্য দিয়ে যেতে stackoverflow.com/a/20839825/2818583
AnV

উত্তর:


119

লোডার শ্রেণিতে getId () নামে একটি পদ্ধতি রয়েছে । আমি আশা করব যে এটি লোডারের সাথে সম্পর্কিত আইডিটি ফিরিয়ে দেয়।


ধন্যবাদ, কুর্তিস! শান্ত! আমি এটি চেষ্টা করব তবে আশা করি এটি কার্যকর হবে। আমি একই ধারণা পেয়েছি কিন্তু লোডার বস্তুর দিকে তাকাতে পারি নি। পরিবর্তে কার্সার অবজেক্টে একবার
দেখেছেন

এটি Loader.getID () এর সাথে কাজ করে! আমি এখনই এটি ডাবল চেক করেছি। গ্রেট!
কে গ্লাডেন

2
আমি অভ্যন্তরীণ / বেনাম শ্রেণি ব্যবহার করে এটি করার কথা ভাবছি, যাতে প্রতিটি লোডারের নিজস্ব বস্তু কলব্যাকগুলি পেয়ে থাকে।
জর্ডস 26'12

@ কুর্তিসনসবাউম, কেন এটি ভুল হবে? বাইরের ক্রিয়াকলাপের সাথে সাথে অভ্যন্তরীণ শ্রেণিটি ধ্বংস হয়ে যাবে, সুতরাং এর ফলে মেমোরি ফাঁস বা অন্য কিছু হতে পারে না। ক্রিয়াকলাপের দৃ strong় রেফারেন্স সহ একটি স্ট্যাটিক শ্রেণি শব্দার্থগতভাবে একটি অভ্যন্তরীণ শ্রেণীর সমতুল্য (যা বাইরের শ্রেণীর একটি অন্তর্নিহিত দৃ strong় রেফারেন্স রাখে।)
ম্যাথিয়াস

6
@ জর্ডস এটি প্রযুক্তিগতভাবে সঠিক। আমি এটা নিয়ে বিতর্ক করছি না আপনি কেবল কল করতে পারেন, কিন্তু কেন যে সমস্ত rigamarol getId()?
কুর্তিস নসবাউম

32

লোডারটির getId () পদ্ধতিটি ব্যবহার করুন :

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    

8

যদি আপনার লোডারদের ফলাফলের শ্রেণীর ধরণের ব্যতীত কিছু মিল না থাকে (এখানে Cursor:), তবে আপনি দুটি পৃথক LoaderCallbacksদৃষ্টান্ত (কেবল আপনার ক্রিয়াকলাপ / খণ্ডে দুটি অভ্যন্তরীণ শ্রেণি হিসাবে ) তৈরি করা ভাল , প্রত্যেকটি একটি লোডার চিকিত্সার জন্য নিবেদিত, বরং কমলার সাথে আপেল মিশ্রিত করার চেষ্টা করার চেয়ে।

আপনার ক্ষেত্রে এটি মনে হয় যে ডেটা উত্স এবং ফলাফল চিকিত্সা উভয়ই পৃথক, যার জন্য আপনার বর্তমান পরিস্থিতি সনাক্ত করতে অতিরিক্ত বয়লারপ্লিট কোড লিখতে হবে এবং এটি যথাযথ কোড ব্লকে প্রেরণ করতে হবে।


আমার একটা প্রশ্ন আছে. Activityবাস্তবায়ন LoaderCallbacksএবং পাস thisকরার উদ্দেশ্য getLoaderManager().initLoader()হ'ল এটি নিশ্চিত করা যে এটি LoaderManagerমধ্যস্থ Activityএবং Loaderমাধ্যমে যোগাযোগের চ্যানেল হিসাবে কাজ করে LoaderCallbacks। কীভাবে এখানে সেই যোগাযোগের চ্যানেল তৈরি করা হচ্ছে যেমন Activityবাস্তবায়ন করা হচ্ছে না LoaderCallbacksবরং বেনামে অভ্যন্তর শ্রেণি তৈরি করা হচ্ছে?
এএনভি

3
যোগাযোগের চ্যানেলটি হ'ল LoaderCallbacks। কিছুই Activityনিজেকে হিসাবে ব্যবহার করার প্রয়োজন হয় না LoaderCallbacks। আপনার যখন প্রয়োজন হয় তখন একাধিক যোগাযোগ চ্যানেল তৈরি করা সহজ।
ব্লেডকডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.