मैं एंड्रॉइड में AsyncTasks के साथ काम कर रहा हूं और मैं किसी समस्या से निपट रहा हूं।एंड्रॉइड AsyncTask संदर्भ व्यवहार
एक सरल उदाहरण लें, एक AsyncTask के साथ एक गतिविधि लें। पृष्ठभूमि पर कार्य कुछ भी शानदार नहीं करता है, यह सिर्फ 8 सेकंड के लिए सोता है।
ऑनपोस्टएक्सक्यूट() विधि में AsyncTask के अंत में मैं केवल एक दृश्य दृश्यता स्थिति को देख रहा हूं। केवल मेरे परिणामों को सत्यापित करने के लिए।
अब, यह तब तक बढ़िया काम करता है जब तक उपयोगकर्ता AsyncTask काम नहीं कर रहा है (8 सेकंड नींद खिड़की के भीतर) अपने फोन अभिविन्यास को बदलने का फैसला करता है।
मैं एंड्रॉइड गतिविधि जीवन चक्र को समझता हूं और मुझे पता है कि गतिविधि नष्ट हो जाती है और फिर से बनाई जाती है।
यह वह जगह है जहां समस्या आती है। AsyncTask एक बटन का जिक्र कर रहा है और स्पष्ट रूप से उस संदर्भ का संदर्भ रखता है जिसने पहले स्थान पर AsyncTask शुरू किया था।
मैं उम्मीद करता हूं कि यह पुराना संदर्भ (चूंकि उपयोगकर्ता ने अभिविन्यास परिवर्तन किया है) या तो शून्य हो गया है और AsyncTask को उस बटन के संदर्भ के लिए एनपीई फेंकने के लिए जो दृश्यमान करने की कोशिश कर रहा है।
इसके बजाय, कोई एनपीई फेंक दिया नहीं गया है, AsyncTask सोचता है कि बटन संदर्भ शून्य नहीं है, इसे दृश्यमान करने के लिए सेट करता है। परिणाम? स्क्रीन पर कुछ भी नहीं हो रहा है!
अद्यतन: मैंने गतिविधि के लिए WeakReference
को रखकर और कॉन्फ़िगरेशन परिवर्तन होने पर स्विचिंग करके इसे हल किया है। यह बोझिल है।
कोड यह रहा:
public class Main extends Activity {
private Button mButton = null;
private Button mTestButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button) findViewById(R.id.btnStart);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new taskDoSomething().execute(0l);
}
});
mTestButton = (Button) findViewById(R.id.btnTest);
}
private class TaskDoSomething extends AsyncTask<Long, Integer, Integer>
{
@Override
protected Integer doInBackground(Long... params) {
Log.i("LOGGER", "Starting...");
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 0;
}
@Override
protected void onPostExecute(Integer result) {
Log.i("LOGGER", "...Done");
mTestButton.setVisibility(View.VISIBLE);
}
}
}
यह क्रियान्वित करने की कोशिश करो और AsyncTask अपने फोन ओरिएंटेशन बदलने काम कर रहा है, जबकि।
लिखने के लिए थोड़ा भ्रामक "लिखने के लिए गतिविधि को कमजोर करना" और कोड में ऐसा करने से नहीं। इससे भी बदतर, आगे आप कहते हैं "और कॉन्फ़िगरेशन परिवर्तन होने पर स्विचिंग" जिसका अर्थ वास्तव में कुछ नहीं है ... क्या स्विच कर रहा है? – Ewoks