नवीनतम Google I/O 2016 ऑडियो प्रस्तुति को देखते हुए, मुझे अंततः इस समस्या के कारण और (बदसूरत) समाधान मिला।
बस (8m56s से शुरु करके) यह आप ट्यूब क्लिप के चारों ओर एक मिनट देखने के लिए: https://youtu.be/F2ZDp-eNrh4?t=8m56s
यह बताता है कि क्यों यह हो रहा है और आप इसे कैसे से छुटकारा पा सकते है।
वास्तव में, एंड्रॉइड बैटरी उपयोग को कम करने के लिए कुछ सेकंड स्पर्श स्पर्श निष्क्रियता के बाद सीपीयू को धीमा कर देता है। वीडियो में लड़का जल्द ही इसके लिए एक उचित समाधान का वादा करता है, लेकिन अब इसके लिए छुटकारा पाने का एकमात्र तरीका नकली स्पर्श भेजना है (यह आधिकारिक सिफारिश है)।
Instrumentation instr = new Instrumentation();
instr.sendKeyDownUpSync(KeyEvent.KEYCODE_BACKSLASH); // or whatever event you prefer
प्रत्येक 1.5 सेकंड में टाइमर के साथ इसे दोहराएं और समस्या गायब हो जाएगी।
मुझे पता है, यह एक बदसूरत हैक है, और इसमें बदसूरत साइड इफेक्ट्स हो सकते हैं जिन्हें संभाला जाना चाहिए। लेकिन अभी के लिए, यह केवल एकमात्र समाधान है।
अद्यतन: आपकी नवीनतम टिप्पणी के बारे में ... यहां मेरा समाधान है। मैं स्क्रीन सीमाओं के बाहर किसी स्थान पर नियमित MotionEvent.ACTION_DOWN का उपयोग कर रहा हूं। बाकी सब कुछ यूआई के साथ एक अवांछित तरीके से हस्तक्षेप किया। SecurityException से बचने के लिए, मुख्य गतिविधि के ऑनस्टार्ट() हैंडलर में टाइमर प्रारंभ करें और इसे ऑनस्टॉप() हैंडलर में समाप्त करें। ऐसी परिस्थितियां अभी भी होती हैं जब ऐप पृष्ठभूमि में जाता है (सीपीयू लोड के आधार पर) जिसमें आप सुरक्षा अपवाद में भाग ले सकते हैं, इसलिए आपको कोशिश करने वाले ब्लॉक के साथ नकली स्पर्श कॉल को घेरे रखना चाहिए।
कृपया ध्यान दें, कि मैं अपना टाइमर ढांचा का उपयोग कर रहा हूं, इसलिए आपको कोड का उपयोग करने के लिए जो भी टाइमर आप उपयोग करना चाहते हैं उसे बदलने के लिए है।
इसके अलावा, मैं अभी तक सुनिश्चित नहीं कर सकता कि कोड 100% बुलेटप्रूफ है। मेरे ऐप्स में हैक लागू है, लेकिन वर्तमान में बीटा राज्य में है, इसलिए यदि आप सभी उपकरणों और एंड्रॉइड संस्करणों पर सही ढंग से काम कर रहे हैं तो मैं आपको कोई गारंटी नहीं दे सकता।
Timer fakeTouchTimer = null;
Instrumentation instr;
void initFakeTouchTimer()
{
if (this.fakeTouchTimer != null)
{
if (this.instr == null)
{
this.instr = new Instrumentation();
}
this.fakeTouchTimer.restart();
}
else
{
if (this.instr == null)
{
this.instr = new Instrumentation();
}
this.fakeTouchTimer = new Timer(1500, Thread.MIN_PRIORITY, new TimerTask()
{
@Override
public void execute()
{
if (instr != null && fakeTouchTimer != null && hasWindowFocus())
{
try
{
long downTime = SystemClock.uptimeMillis();
MotionEvent event = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, -100, -100, 0);
instr.sendPointerSync(event);
event.recycle();
}
catch (Exception e)
{
}
}
}
}, true/*isInfinite*/);
}
}
void killFakeTouchTimer()
{
if (this.fakeTouchTimer != null)
{
this.fakeTouchTimer.interupt();
this.fakeTouchTimer = null;
this.instr = null;
}
}
@Override
protected void onStop()
{
killFakeTouchTimer();
super.onStop();
.....
}
@Override
protected void onStart()
{
initFakeTouchTimer();
super.onStart();
.....
}
एंड्रॉइड 4.4.2 पर चल रहे नेक्सस 5 पर भी नहीं होता है। –
प्लेबैक के दौरान लॉगिंग थ्रेड प्राथमिकता यह दिखाती है कि स्क्रीन टैप करते समय थ्रेड प्राथमिकता वास्तव में बदल नहीं रही है। हो सकता है कि टच इवेंट एक इंटरप्ट को ट्रिगर कर रहा हो जो शेड्यूलर को वापस आने की संभावना है? –
मुझे अपने ऐप्स में एक ही समस्या है। जब तक मैं स्क्रीन से बातचीत करता हूं, तब तक सभी चिकनी चलते हैं। जैसे ही मैं स्क्रीन को छूना बंद कर देता हूं, यह कुछ (लगभग 3-5 सेकंड) के बाद बड़े पैमाने पर ड्रॉप आउट के साथ शुरू होता है। जब मैं स्क्रीन के साथ फिर से बातचीत करना शुरू करता हूं, तो यह सुचारू संचालन पर वापस आ जाता है। इससे कोई फर्क नहीं पड़ता कि स्क्रीन परस्पर क्रिया कुछ वास्तविक है, न ही अगर उंगली एक विशिष्ट नियंत्रण/बटन के साथ ट्रिगर कर रही है। जैसे ही एक उंगली स्क्रीन पर चल रही है, सभी ऑडियो चिकनी चलते हैं। यह एंड्रॉइड 5.x पर नहीं होता है, यह अभी 6.0 के साथ शुरू हुआ है, और यह एंड्रॉइड एन – gal