पर मेरी समस्या में तीन समर्थन खंडों की एक गतिविधि शामिल है। एक सामान्य प्रोग्रामेटिक टुकड़ा है (चलिए इसे घर का टुकड़ा कहते हैं)। कॉन्फ़िगरेशन परिवर्तनों के बावजूद एक एसिंक कार्य जारी रखने के लिए, डिवाइस उन्मुख होने पर घर के टुकड़े के शीर्ष पर एक पोर्ट्रेट टुकड़ा जोड़ा जाता है, और एक 'हेडलेस' होता है। बहुत आसान, मैं this nice example से काम कर रहा था।फ्रैगमेंट ए के लिए findFragmentByTag शून्य, अगर सेटगेटन (सत्य) Fragment B
public class HeadlessCustomerDetailFetchFragment extends Fragment{
private RequestCustomerDetails mRequest;
private AsyncFetchCustomerDetails mAsyncFetchCustomerDetails;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mRequest = (RequestCustomerDetails)getActivity();
}
public void startFetching(String scannedBarcode) {
if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.RUNNING) return;
if(mAsyncFetchCustomerDetails == null || mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.FINISHED)
mAsyncFetchCustomerDetails = new AsyncFetchCustomerDetails(getActivity(), mRequest, mPartner, scannedBarcode);
}
public void stopFetching() {
if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() != AsyncTask.Status.RUNNING) return;
mAsyncFetchCustomerDetails.cancel(true);
}
}
मेरी गतिविधि के onCreate में() मैं बना सकते हैं और यदि आवश्यक हो तो बिना सिर टुकड़ा जोड़ें।
mHeadlessCustomerDetailFetchFragment = (HeadlessCustomerDetailFetchFragment)getSupportFragmentManager()
.findFragmentByTag(HeadlessCustomerDetailFetchFragment.class.getSimpleName());
if(mHeadlessCustomerDetailFetchFragment == null) {
mHeadlessCustomerDetailFetchFragment = HeadlessCustomerDetailFetchFragment.instantiate(this, HeadlessCustomerDetailFetchFragment.class.getName());
getSupportFragmentManager().beginTransaction()
.add(mHeadlessCustomerDetailFetchFragment, mHeadlessCustomerDetailFetchFragment.getClass().getSimpleName())
.commit();
getSupportFragmentManager().executePendingTransactions();
id = null;
}
मैं तो (परीक्षण के लिए) एक 6 सेकंड की देरी के बाद (मेरे startFetching() फ़ंक्शन के माध्यम से) एक async कार्य का शुभारंभ चित्र टुकड़ा की onCreateView में शुरू हुआ() कि जोड़ा जाता है जब पोट्रेट पर उन्मुखीकरण परिवर्तन । उन्मुखीकरण परिवर्तन गतिविधि के OnCreate() में पाया जाता है:
if (savedInstanceState == null) {
// Do some initial stuff for the home fragment
}
else {
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//Launch portrait fragment
FragmentLauncher.launchPortraitFragment(this);
}
जब कार्य समाप्त हो गया है, मैं गतिविधि में लौटने और सक्रिय चित्र टुकड़ा के यूआई अद्यतन करने का प्रयास है, लेकिन टुकड़ा प्रबंधक यह नहीं मिल सकता है, findFragmentByTag() शून्य देता है।
स्पष्ट है:
- टैग सही है
- टुकड़ा मिला है अगर मैं डिवाइस बोध, और बदले कहीं और async कार्य शुरू (गतिविधि के onResume दौरान, नहीं है) उदाहरण के लिए।
- यदि मैं अपने आप को बनाए रखने के लिए हेडलेस टुकड़े नहीं बताता - जिससे इसे पुन: प्रयास न करने का लाभ खो जाता है, तो चित्र खंड भी सही ढंग से पाया जाता है।
- डीबगिंग मैनेजर में सभी 3 टुकड़े देख सकते हैं यदि हेडलेस एक खुद को बनाए रखने के लिए सेट नहीं है। यदि ऐसा है, तो मैं केवल हेडलेस खंड देख सकता हूं।
शायद एक टुकड़ा को बरकरार रखने से अन्य टुकड़ों को आक्रामक रूप से मार दिया जाता है जो कि बनाए रखा नहीं जाता है या उस प्रभाव से कुछ?
आप सेवा में अपना एसिंक्टस्क क्यों नहीं कर सकते हैं? मेरा मानना है कि यह आपके घूर्णन मुद्दे को समाप्त करता है और यह करने के लिए एक साफ तरीका भी है? – Smashing
मुझे ऐसा भी लगता है - मुझे सेवाओं के बारे में बहुत कुछ पता नहीं है और ऐसा लगता है कि यह एक काम के लिए अधिक है, लेकिन यह मेरा एकमात्र विकल्प हो सकता है - इसमें देखेंगे –
कूलबीन्स। मुझे बताएं क्या आपको किसी भी तरह की मदद की ज़रूरत है। – Smashing