2013-04-23 6 views
6

हमारे एंड्रॉइड ऐप में लॉगबैक खोल प्रक्रिया उत्पन्न होती है और फिर प्रोसेसिंग के लिए इसका परिणाम पढ़ता है। हालांकि, जब ऐप बंद हो जाता है (उदा। जब विकास के दौरान पुनर्मूल्यांकन के बाद पुनरारंभ होता है), तो लॉगकैट प्रक्रिया चलती रहेगी। यहाँ इस व्यवहार का एक उदाहरण है:एंड्रॉइड: अभिभावक प्रक्रिया (एप) की मृत्यु हो जाने के बाद चाइल्ड प्रोसेस (एप) की मृत्यु हो गई

processes = new ArrayList<Process>(); 

try { 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
    processes.add(Runtime.getRuntime().exec("logcat -v time")); 
} catch (IOException e) { 
    // oh no! 
} 

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
    for (Process p : processes) { 
     p.destroy(); 
    } 
    }; 
}); 

OnCreate() एक परीक्षण app की विधि को यह जोड़ें, यह शुरू करते हैं, तो सेटिंग्स प्रबंधक का उपयोग कर के लिए मजबूर-स्टॉप यह। बच्चे की प्रक्रियाएं चलती रहेंगी, अब 1.

How to kill logcat process initiated by Android application? में प्रोसेसबिल्डर का उपयोग करने का सुझाव दिया गया था, लेकिन यह समाधान नहीं था और प्रक्रिया भी चलती रहेगी।

Stop child process when parent process stops में इसे शटडाउन हुक का उपयोग करने का सुझाव दिया गया था - जो ऊपर दिखाए गए अनुसार काम नहीं करता है।

धन्यवाद!

+0

क्या आपने p.destroy() के बाद p.waitFor() को कॉल करने का प्रयास किया था? अगली कॉल को नष्ट करने से पहले, पूर्व कॉल बच्चे की प्रक्रिया को समाप्त करने और वापसी की स्थिति प्राप्त करने की प्रतीक्षा करती है। – Vikdor

+0

@ विकोडर धन्यवाद, लेकिन नहीं, काम नहीं करता है। वास्तव में, शटडाउन हुक में एक लॉगिंग कॉल जोड़ने से पता चलता है कि एप्लिकेशन (बल-) बंद होने पर इसे बिल्कुल कॉल नहीं किया जाता है। – hez

+0

मुझे लगता है कि 'नई थ्रेड()' में 'प्रक्रियाओं' की प्रति खाली है। क्या आपने 'फॉर लूप' या लूप के बाहर से लॉग किया था? क्या आप प्रक्रियाओं को अस्थिर के रूप में चिह्नित कर सकते हैं ताकि धागे प्रतिलिपि को कैश न करें, और फिर जांचें? – Vikdor

उत्तर

1

क्या आप कर सकते हैं एक और स्क्रिप्ट स्पैनिंग है जिसका एकमात्र उद्देश्य अपने जावा प्रोग्राम को देखना है। जब भी यह मर जाता है, तो अपने सभी बच्चों को भी मार दें।

एक नाजुक उदाहरण:

int pid = android.os.Process.myPid(); 
String script = "while [ -d /proc/" + pid + " ];do sleep 1;done; killall logcat"; 
Process p = Runtime.getRuntime().exec("/system/bin/sh", "-c", script); 

मतलब यह है कि अपनी प्रक्रिया, रूट के रूप में नहीं चलता है जिससे केवल अपने स्वयं के logcat प्रक्रियाओं की मौत हो गई। अपने शटडाउन फ़ंक्शन में, आपको पहले अन्य प्रक्रियाओं को मारना चाहिए (logcat) और फिर इस हत्यारा स्क्रिप्ट को रोकने के लिए p.destroy(); चलाएं।

उपरोक्त स्क्रिप्ट को killall के उपयोग को हटाकर सुधार किया जा सकता है। इसके बजाय, प्रतिबिंब (this answer अंक http://www.golesny.de/p/code/javagetpid) का उपयोग करके logcat प्रक्रियाओं की प्रक्रिया आईडी प्राप्त करें और उन्हें kill पर पास करें।

+0

शानदार, आप बहुत स्मार्ट हैं। धन्यवाद एक अरब आदमी! – Krypton

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