2011-10-28 10 views
7

के रूप में एक अपवाद दर्रा मैं एक गतिविधि स्क्रीन के लिए प्रासंगिक जानकारी डंप करने के लिए होती के लिए एक अपवाद पारित करने के लिए कोशिश कर रहा हूँ।एक पार्सल

वर्तमान में मैं यह एक बंडल के माध्यम से पारित:

try { 
    this.listPackageActivities(); 
} catch (Exception e) { 
    Intent intent = new Intent().setClass(this, ExceptionActivity.class).putExtra("Exception", e); 
    startActivity(intent); 
} 

लेकिन जब वह वहाँ हो जाता है:

if (!(this.bundle.getParcelable("Exception") != null)) 
    throw new IndexOutOfBoundsException("Index \"Exception\" does not exist in the parcel." + "/n" 
    + "Keys: " + this.bundle.keySet().toString()); 

यह मिठाई अपवाद फेंक दिया जाता है लेकिन जब मैं कीसेट को देखो और बंडल विवरण यह बताता है मुझे लगता है कि "अपवाद" नामक कुंजी के साथ एक पार्सलबल ऑब्जेक्ट है।

मैं समझता हूँ कि इस प्रकार के साथ क्या करना है कि कुछ लेकिन मुझे समझ नहीं आता मैं गलत क्या कर रहा हूँ। मैं बस एक अपवाद के बारे में जानकारी डंप करना चाहता हूं, स्क्रीन के लिए कोई अपवाद। क्या हर बार एक स्ट्रिंग में सभी जानकारी को बिना किसी परेशानी के किए ऐसा करने का कोई तरीका है?

उत्तर

14

मैं इस सवाल जब मैं एक विधि के लिए खोज रहा था एक सेवा से एक गतिविधि के लिए अपवाद पारित करने के लिए पर ठोकर खाई। हालांकि, मुझे एक बेहतर विधि मिली, आप बंडल कक्षा के putSerializable() विधि का उपयोग कर सकते हैं।

जोड़ने के लिए:

Throwable exception = new RuntimeException("Exception"); 
Bundle extras = new Bundle(); 
extras.putSerializable("exception", (Serializable) exception); 

Intent intent = new Intent(); 
intent.putExtras(extras); 

को पुनः प्राप्त करने के लिए:

Bundle extras = intent.getExtras(); 
Throwable exception = (Throwable) extras.getSerializable("exception"); 
String message = exception.getMessage(); 
2

वर्ग अपवाद Parcelable इंटरफ़ेस को लागू नहीं करता है। जब तक एंड्रॉयड कुछ बुनियादी जावा निर्माणों जिनमें से मैं अनभिज्ञ हूं टूट रहा है, यह आप एक बंडल में एक पार्सल के रूप में एक अपवाद नहीं डाल सकते है।

आप एक नया गतिविधि execption "पारित" करने के लिए, बस इसे के पहलुओं है कि आप अपने नए गतिविधि में आवश्यकता के लिए जा रहे ऊपर बंडल चाहते हैं। उदाहरण के लिए, मान लीजिए कि आप बस अपवाद संदेश और स्टैकट्रैक के साथ पास करना चाहते हैं। तुम बहुत कुछ इस तरह हैं:

Intent intent = new Intent().setClass(this,ExceptionActivity.class) 
intent.putExtra("exception message", e.getMessage()); 
intent.putExtra("exception stacktrace", getStackTraceArray(e)); 
startActivity(intent); 

जहां getStackTraceArray इस तरह दिखता है:

private static String[] getStackTraceArray(Exception e){ 
    StackTraceElement[] stackTraceElements = e.getStackTrace(); 
    String[] stackTracelines = new String[stackTraceElements.length]; 
    int i =0; 
    for(StackTraceElement se : stackTraceElements){ 
    stackTraceLines[i++] = se.toString(); 
    } 
    return stackTraceLines; 
} 
+0

Haha, मैं मान लिया है नहीं करना चाहिए। क्या गतिविधि को जानकारी पास करने का कोई बेहतर तरीका है? एक बनाने के –

+0

: सार्वजनिक वर्ग ParcelableException अपवाद फैली लागू करता Parcelable {...} – yorkw

+0

इसके समाधान के लिए मेरा उत्तर अपडेट किया गया। –

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