2011-11-16 22 views
6

में किसी अन्य बिंदु से फिर से शुरू होता है प्रश्न में आवेदन पहले से ही तैनात किया जा चुका है। मुझे ACRA पता चला है, और यह पता लगाने के लिए कि एप्लिकेशन क्रैश क्यों हो रहा है, जोड़ देगा।एंड्रॉइड एप्लिकेशन क्रैश हो जाता है, लेकिन पुनरारंभ नहीं होता है - एप्लिकेशन

मेरी समस्या हालांकि, यह है कि एप्लिकेशन क्रैश हो जाएगा (संवाद आपको "फोर्स क्लोज़" या "प्रतीक्षा" करने का विकल्प देगा), लेकिन एप्लिकेशन को पूरी तरह से पुनरारंभ करने के बजाय, यह पहले एक बिंदु से फिर से शुरू होता है दुर्घटना हुई। इससे समस्याएं उत्पन्न होती हैं, जो केवल एप्लिकेशन को पुनरारंभ करके तय की जाती हैं (उदाहरण के लिए डेटा का अचानक नुकसान, क्रैश जो समझ में नहीं आता है)।

तो मैं एक बार दुर्घटनाग्रस्त हो जाने के बाद, मेरे आवेदन को कैसे मजबूर कर सकता हूं? (पुनरारंभ नहीं)।

संपादित करें: सबसे बड़ी समस्या यह है कि एप्लिकेशन क्रैश होने के बाद, मेरी प्राथमिकता फ़ाइल में मौजूद सभी डेटा गायब हो जाते हैं, जब तक कि यह वापस आने पर ऐप पुनरारंभ नहीं हो जाता।

+0

के लिए रवाना होने से पहले एक एक करके अपने अपवाद एक के सभी संभाल मेरा मानना ​​है कि क्या तुम यहाँ का सामना कर रहे एक 'ANR' या गतिविधि नहीं है की कोशिश करना है जवाब देना, जो ऐप क्रैश से अलग है (फोर्स क्लोज़)। ऐसा लगता है कि आपके ऐप में कुछ ऑपरेशन मुख्य थ्रेड (यूआई थ्रेड) को एक निश्चित अवधि के लिए अवरुद्ध कर रहा है, जो इस बल को बंद/प्रतीक्षा संवाद को संकेत दे रहा है। यदि आप प्रतीक्षा करते हैं, तो ऐप उस ऑपरेशन के पूरा होने की सीमा के लिए उत्तरदायी नहीं रहेगा। फिर, ऐप फिर से शुरू होगा। लेकिन एक बार जब आप 'फोर्स क्लोज' दबाते हैं, तो ऐप बंद हो जाएगा और अगली बार जब आप इसे एक्सेस करेंगे तो पुनरारंभ होगा – Abhijit

+0

यह एएनआर का मामला नहीं है, कभी-कभी यह "फोर्स क्लोज़" या "प्रतीक्षा" दिखाता है जो कि है यूआई थ्रेड अवरुद्ध किया जा रहा है, लेकिन कभी-कभी यह सिर्फ "फोर्स क्लोज़" होता है, इसलिए एप्लिकेशन वास्तव में क्रैश हो गया है। और ऐप लगातार बंद नहीं होता है - कुछ प्लेटफ़ॉर्म पर यह बंद हो जाता है, लेकिन दूसरों पर यह पिछले बिंदु से फिर से शुरू होता है और सभी prefrences डेटा खो देता है। – digerati32

उत्तर

3

एंड्रॉइड डिफ़ॉल्ट रूप से अंतिम सक्रिय गतिविधि को फिर से शुरू करेगा। इसे पुनरारंभ करने के लिए मजबूर करने के बजाय, बेहतर रणनीति आपके आवेदन को ठीक करना होगा, ताकि कोई डेटा उपलब्ध न होने पर गतिविधियां क्रैश न हों या शानदार तरीके से बाहर निकलें। यदि आप पूरी तरह से कुछ डेटा (इरादा अतिरिक्त) पर निर्भर करते हैं और कोई चूक नहीं है, तो आप finish() पर कॉल कर सकते हैं यदि यह उपलब्ध नहीं है, या मुख्य/मूल गतिविधि शुरू करें।

एसीआरए का उपयोग करके दुर्घटना की रिपोर्ट करने के बाद अपना मुख्य अपवाद हैंडलर जो मुख्य गतिविधि को फिर से शुरू करता है, का एक और तरीका है (मुझे लगता है कि एसीआरए के बगट्रैक में इसके लिए एक फीचर अनुरोध है)।

+0

मैं अपने आवेदन को ठीक करना चाहता हूं, लेकिन दुर्भाग्यवश इसे पहले ही तैनात कर दिया गया है, और मैंने अब अपवादों को पकड़ने के लिए एसीआरए जोड़ा है, लेकिन अगर कुछ भी होता है तो मैं आवेदन को मजबूती से छोड़ना चाहता हूं। मैंने एसीआरए की जांच की और उस सुविधा को नहीं मिला ...मुझे लगता है कि इसे अभी तक लागू नहीं किया गया है? – digerati32

+1

सिर्फ इसलिए कि इसकी तैनाती का मतलब यह नहीं है कि आप इसे ठीक नहीं कर सकते हैं और इसे पुन: नियोजित नहीं कर सकते हैं, लोग खुशी से क्रैश को ठीक करने के लिए अपने ऐप्स अपडेट करेंगे। –

+0

यह किस ओएस संस्करण पर निर्भर करता है (या यह फोन द्वारा कैसे कार्यान्वित किया गया था) यह एप्लिकेशन क्रैश होने पर एप्लिकेशन बंद कर देगा। मैं ACRA के साथ भी क्रैश होने पर एप्लिकेशन को बंद करने के लिए एक रास्ता खोजने में सक्षम नहीं हूं। सबसे अधिक आप एसीआरए के साथ एक "शांत" क्रैश कर सकते हैं, ताकि कोई संवाद दिखाई न दे। मैंने एसीआरए स्थापित के साथ अद्यतन जोड़ा है, इसलिए मैं उम्मीद करता हूं कि दुर्घटनाओं के कारणों को प्राप्त करने में सक्षम होंगे और फिर मैं उन्हें ठीक कर सकता हूं। मैं बस आपके प्रश्न को सही के रूप में चिह्नित करने जा रहा हूं क्योंकि यह सही होने के सबसे नज़दीक है ... हालांकि कोई जवाब नहीं है। – digerati32

1

मैं जानता हूँ कि इस सवाल का एक सा पुराना है, लेकिन भविष्य में संदर्भ और Googler के लिए, यहाँ एक और से एक पूरा जवाब, मुश्किल, stackoverflow सवाल यह है: Android App Restarts upon Crash/force close


unCaughtException को संभालने के लिए प्रयोग किया जाता है एक वर्ग बनाने

public class MyExceptionHandler implements 
     java.lang.Thread.UncaughtExceptionHandler { 
    private final Context myContext; 
    private final Class<?> myActivityClass; 

    public MyExceptionHandler(Context context, Class<?> c) { 

     myContext = context; 
     myActivityClass = c; 
    } 

    public void uncaughtException(Thread thread, Throwable exception) { 

     StringWriter stackTrace = new StringWriter(); 
     exception.printStackTrace(new PrintWriter(stackTrace)); 
     System.err.println(stackTrace);// You can use LogCat too 
     Intent intent = new Intent(myContext, myActivityClass); 
     String s = stackTrace.toString(); 
     //you can use this String to know what caused the exception and in which Activity 
     intent.putExtra("uncaughtException", 
       "Exception is: " + stackTrace.toString()); 
     intent.putExtra("stacktrace", s); 
     myContext.startActivity(intent); 
     //for restarting the Activity 
     Process.killProcess(Process.myPid()); 
     System.exit(0); 
    } 
} 
हर धागे में

तो (आमतौर पर आप केवल एक है, जब तक आप एक नया धागा (Async या ... शुरू करते हैं, बिल्कुल आप धागे के बारे में पता है, तो आप नए बनाने में सक्षम हैं;)), इस वर्ग के सेट DefaultUncaughtExceptionHandler के रूप में

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, 
      YourCurrentActivity.class)); 

हालांकि याद रखें! आपके आवेदन को विकसित करने के आखिरी चरण में यह करते हैं, आप कम से कम उन्हें DefaultUncaughtExceptionHandler

+0

हमें एसीआरए दोनों के साथ-साथ पूरे एप्लिकेशन को पुनरारंभ करने की आवश्यकता है –

संबंधित मुद्दे