एंड्रॉइड में लोडर (लीगेसी) बनाम आधुनिक विकल्प
लोडर (android.app.LoaderManager, CursorLoader) API 28 में डिप्रिकेट हो गए हैं। नए कोड के लिए, ViewModel + LiveData/Flow + Room/Paging 3 या Coroutines + Flow का उपयोग करें। यह लेख लीगेसी लोडर API को संदर्भ के लिए दस्तावेज करता है और आधुनिक प्रतिस्थापन दिखाता है।
लीगेसी लोडर उदाहरण (केवल संदर्भ)
// डिप्रिकेट - नए प्रोजेक्ट्स में उपयोग न करें
public class LegacyLoaderActivity extends AppCompatActivity
implements LoaderManager.LoaderCallbacks {
private static final int LOADER_ID = 1;
private SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = findViewById(R.id.list);
String[] from = {ContactsContract.Contacts.DISPLAY_NAME};
int[] to = {android.R.id.text1};
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, from, to, 0);
lv.setAdapter(adapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
@NonNull @Override
public Loader onCreateLoader(int id, Bundle args) {
return new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI,
new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME},
null, null, ContactsContract.Contacts.DISPLAY_NAME);
}
@Override
public void onLoadFinished(@NonNull Loader loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(@NonNull Loader loader) {
adapter.swapCursor(null);
}
}
आधुनिक प्रतिस्थापन: ViewModel + Room + LiveData
1. Room एंटिटी और DAO
@Entity(tableName = "contacts")
public class Contact {
@PrimaryKey public long id;
public String name;
public String phone;
}
@Dao
public interface ContactDao {
@Query("SELECT * FROM contacts ORDER BY name")
LiveData> getAllContacts();
}
2. रिपॉजिटरी
public class ContactRepository {
private final ContactDao dao;
public ContactRepository(Application app) {
dao = Room.databaseBuilder(app, AppDatabase.class, "db").build().contactDao();
}
public LiveData> getAll() { return dao.getAllContacts(); }
}
3. व्यूमॉडल
public class ContactViewModel extends AndroidViewModel {
private final LiveData> contacts;
public ContactViewModel(Application app) {
super(app);
contacts = new ContactRepository(app).getAll();
}
public LiveData> getContacts() { return contacts; }
}
4. गतिविधि/फ्रैगमेंट में अवलोकन करें
public class MainActivity extends AppCompatActivity {
private ContactAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView rv = findViewById(R.id.recyclerView);
rv.setLayoutManager(new LinearLayoutManager(this));
adapter = new ContactAdapter();
rv.setAdapter(adapter);
new ViewModelProvider(this).get(ContactViewModel.class)
.getContacts()
.observe(this, list -> adapter.submitList(list));
}
}
क्यों आधुनिक स्टैक बेहतर है
| पहलू | लीगेसी लोडर | ViewModel + LiveData |
|---|---|---|
| जीवनचक्र-जागरूक | हां (लोडर मैनेजर के माध्यम से) | हां (ViewModel + LifecycleOwner) |
| कॉन्फिग परिवर्तन पर जीवित रहता है | हां | हां |
| टाइप-सेफ क्वेरी | नहीं (कर्सर/स्ट्रिंग कॉलम) | हां (DAO मेथड्स) |
| पेजिनेशन सपोर्ट | नहीं | हां (Paging 3) |
| टेस्टेबिलिटी | कठिन | आसान (ViewModel मॉक करें) |
| कोरआउटिन/फ्लो इंटरऑप | नहीं | मूल |
माइग्रेशन चेकलिस्ट
- निर्भरताएं जोड़ें: Room, Lifecycle/ViewModel, RecyclerView, (वैकल्पिक) Paging 3।
- एंटिटी, DAO, डेटाबेस, रिपॉजिटरी, ViewModel बनाएं।
- ListView + CursorAdapter को RecyclerView + ListAdapter में बदलें।
- लोडर कॉलबैक को
observe()से बदलें। - परीक्षण करें: घुमाएं, बैकग्राउंड/फोरग्राउंड, बड़ा डेटासेट।
निष्कर्ष: रखरखाव, टाइप सुरक्षा और भविष्य-प्रूफिंग के लिए ViewModel + Room + LiveData/Flow का उपयोग करें। लोडर केवल पुराने कोडबेस को बनाए रखने के लिए हैं।