ईएमएम के आधार पर किया गया था ... यदि आप ऐसा करने नहीं दिया जाना चाहिए।
क्योंकि अभिभावक वर्ग के लिए अदृश्य संदर्भ संग्रहीत करके अज्ञात वर्ग कैसे अभिभावक वर्ग विधि या फ़ील्ड का उपयोग करता है।
उदाहरण के लिए
आपके पास एक Activity
:
public class MyActivity
extends Activity
{
public void someFunction() { /* do some work over here */ }
public void someOtherFunction() {
Runnable r = new Runnable() {
@Override
public void run() {
while (true)
someFunction();
}
};
new Thread(r).start(); // use it, for example here just make a thread to run it.
}
}
संकलक वास्तव में कुछ इस तरह उत्पन्न करेगा:
private static class AnonymousRunnable {
private MyActivity parent;
public AnonymousRunnable(MyActivity parent) {
this.parent = parent;
}
@Override
public void run() {
while (true)
parent.someFunction();
}
}
तो, जब आपके माता-पिता Activity
नष्ट कर देता है (विन्यास परिवर्तन के कारण, उदाहरण के लिए) , और आपकी अनाम कक्षा अभी भी मौजूद है, पूरी गतिविधि जीसी-एड नहीं हो सकती है। (क्योंकि किसी के पास अभी भी एक संदर्भ है।)
जो एक स्मृति लीक बनता है और आपके एप को लिम्बो जाओ !!!
अगर यह मैं था, मैं इस तरह लोडर के लिए "onProgressUpdate()" को क्रियान्वित करेगी:
public class MyLoader extends AsyncTaskLoader<Something> {
private Observable mObservable = new Observable();
synchronized void addObserver(Observer observer) {
mObservable.addObserver(observer);
}
synchronized void deleteObserver(Observer observer) {
mObservable.deleteObserver(observer);
}
@Override
public void loadInBackground(CancellationSignal signal)
{
for (int i = 0;i < 100;++i)
mObservable.notifyObservers(new Integer(i));
}
}
और अपने Activity
कक्षा में
public class MyActivity extends Activity {
private Observer mObserver = new Observer() {
@Override
public void update(Observable observable, Object data) {
final Integer progress = (Integer) data;
mTextView.post(new Runnable() {
mTextView.setText(data.toString()); // update your progress....
});
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreated(savedInstanceState);
MyLoader loader = (MyLoader) getLoaderManager().initLoader(0, null, this);
loader.addObserver(mObserver);
}
@Override
public void onDestroy() {
MyLoader loader = (MyLoader) getLoaderManager().getLoader(0);
if (loader != null)
loader.deleteObserver(mObserver);
super.onDestroy();
}
}
onDestroy()
दौरान deleteObserver()
के लिए याद महत्वपूर्ण है , इस प्रकार लोडर हमेशा आपकी गतिविधि का संदर्भ नहीं रखता है। (लोडर शायद आपके Application
जीवन चक्र के दौरान जिंदा आयोजित किया जाएगा ...)
मुझे लगता है कि यह एक बहुत चालाक हैक है। मैंने इसके बारे में कभी सोचा नहीं। मैं लोडर का उपयोग करके अपने प्रगति अद्यतन भेजने का तरीका ढूंढ रहा था। मैं इसे आज़मा दूंगा और आपको बता दूंगा। मुझे लगता है कि आपका समाधान काम करना चाहिए !! – douggynix
लिंक खराब हो गया प्रतीत होता है। [यहां] (https://yadi.sk/d/qovznXrpUbbum) एक कामकाजी है (मुझे लगता है कि यह वही है)। – EmmanuelMess