OnResume () onActivityResult () से पहले कहा जाता है?


79

यहाँ बताया गया है कि मेरा ऐप किस तरह से बनाया गया है:

  1. onResume () उपयोगकर्ता को लॉगिन करने के लिए प्रेरित किया जाता है
  2. यदि उपयोगकर्ता लॉग इन करता है, तो वह ऐप 3 का उपयोग जारी रख सकता है । यदि उपयोगकर्ता किसी भी समय लॉग आउट करता है, तो मैं फिर से लॉगिन करना चाहता हूं

इसे कैसे प्राप्त किया जा सकता है?

यहाँ मेरी मुख्यता है:

@Override
    protected void onResume(){
        super.onResume();

        isLoggedIn = prefs.getBoolean("isLoggedIn", false);

        if(!isLoggedIn){
            showLoginActivity();
        }
    }

यहाँ मेरा लॉगिन है:

@Override
        protected void onPostExecute(JSONObject json) {
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try {
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized)){
                    Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show();
                    prefs.edit().putBoolean("isLoggedIn",true);

                    setResult(RESULT_OK, getIntent());
                    finish();
                }
                else if (status.equals(unauthorized)){
                    Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
                else if(status.equals(notfound)){
                    Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
            } catch (JSONException e) {
                System.out.println(e);
            } catch (NullPointerException e) {
                System.out.println(e);
            }
        }
    }

उपयोगकर्ता सफलतापूर्वक लॉग इन करने के बाद:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
        }
    }

समस्या यह है कि, onResume () को onActivityResult () से पहले कहा जाता है, इसलिए जब उपयोगकर्ता सफलतापूर्वक लॉग इन कर लेता है, तो मेरी मुख्य गतिविधि को नोटिफाई नहीं किया जाता है क्योंकि onResume () पहले कहा जाता है।

लॉगिन के लिए संकेत करने के लिए सबसे अच्छी जगह कहां है?

जवाबों:


102

OnActivityResult पर कॉल onResume से पहले होता है, वास्तव में ( डॉक्स देखें )। क्या आप सुनिश्चित हैं कि आप वास्तव में उस गतिविधि को शुरू कर रहे हैं जिसे आप चाहते थे startActivityForResultऔर आप RESULT_OKअपनी गतिविधि का मूल्य वापस करने से पहले लागू गतिविधि का परिणाम निर्धारित कर रहे हैं ? उस मान को लॉग करने के लिए Logअपने स्टेटमेंट को डालने की कोशिश करें onActivityResultऔर सुनिश्चित करें कि हिट हो जाए। इसके अलावा, आप isLoggedInवरीयता के मूल्य को कहां स्थापित कर रहे हैं? ऐसा लगता है कि आपको किसी भी तरह trueसे लौटने से पहले अपनी लॉगिन गतिविधि में सेट करना चाहिए , लेकिन यह स्पष्ट रूप से नहीं हो रहा है।

संपादित करें

डॉक्स कहते हैं:

जब आपकी गतिविधि फिर से शुरू हो रही हो, तो आपको onResume () से तुरंत पहले यह कॉल प्राप्त होगी।


उपयोगकर्ता द्वारा लॉग इन करने के बाद मैं isLoggedIn सेट कर रहा हूं। मेरा अपडेट किया गया कोड देखें। सुनिश्चित नहीं है कि क्या गलत है?
शीहान आलम

1
आप सही हैं, onActivityResult () onResume () से पहले बुलाया जा रहा है। यकीन नहीं होता कि मेरे प्रीफ्स गलत क्यों पढ़े जा रहे हैं?
शीहान आलम

4
ध्यान दें कि onActivityResultइसे पहले भी कहा जाता है onStart, जिसे कई लोगों द्वारा बग माना जाता है: code.google.com/p/android/issues/detail?id=17787
Denis Kniazhev

30

अंशों के साथ यह onActivityResult()कॉल करने से पहले कॉल किए जाने के रूप में भी सरल नहीं है onResume()। यदि आप जिस गतिविधि पर लौट रहे हैं, वह अंतरिम में निपटा दी गई है, तो आप पाएंगे कि (उदाहरण के लिए) getActivity()से कॉल onActivityResult()अशक्त हो जाएगी। हालाँकि, यदि गतिविधि का निपटान नहीं किया गया है, तो कॉल से getActivity()युक्त गतिविधि वापस आ जाएगी।

यह असंगति कठिन-से-निदान दोषों का स्रोत हो सकती है लेकिन आप डेवलपर विकल्प "गतिविधियों को न रखें" को सक्षम करके अपने आवेदन के व्यवहार की जांच कर सकते हैं। मैं इसे चालू रखना चाहता हूं - मैं NullPointerExceptionउत्पादन के बजाय विकास में देखना चाहता हूं ।


2

आप गतिविधि से लॉगिन स्थिति को दूर करने पर विचार कर सकते हैं। उदाहरण के लिए यदि कोई उपयोगकर्ता टिप्पणी पोस्ट कर सकता है, तो सक्रिय स्थिति के बजाय लॉगिन राज्य के लिए ऑनपोस्ट एक्शन पिंग और वहां से जाने दें।


0

onResumeअनुरोधित कार्यक्षमता को प्राप्त करने के लिए कॉलबैक विधियाँ उपयुक्त स्थान नहीं हैं। मेरा सुझाव है कि एक वर्ग बनाना और वहां साइन-इन / साइन-आउट कार्यक्षमता जोड़ना। जब एक साइनआउट कॉलबैक प्राप्त होता है, तो साइन-इन कार्यक्षमता को कॉल करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.