互动屏保界面点击“立即启动”无响应
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
系统设置--显示--互动屏保--选择未点击的屏保方式(万花筒或者时钟)--点击“立即启动”
按键有变色,但是没有出现屏保,再次点击1次或多次才有反应
[SOLUTION]
这個問題的root cause是DreamManagerService文件中的dream函數先調用了userActivity然後,又
調用了Nap,前面一個userActivtiy也會通過消息機制進入handleSanDMAn函數,但是這個函數還沒
有走完,就走了下一次Nap函數,這時Nap函數,修改了WakeFullNess的狀態,然後線程又切換到
handleSandMan,就擾亂了後面又要進來的handleSandMan的執行狀態,所以屬於線程沒有同步好導致
的,由於這個問題無法做同步,所以只能盡量減小這個問題的概率了。
減小 的方法就是讓原來的線程先休眠一會再進入Nap操作,即不會讓原來的handleSandman還沒有執
行完,就開始Nap。主要是不原來的線程搶CPU。
修改方法如下:
請在DreamManagerService.java中做如下的修改(有mtk modify的是新添加的):
@Override // Binder call
public void dream() {
checkPermission(android.Manifest.permission.WRITE_DREAM_STATE);
final long ident = Binder.clearCallingIdentity();
try {
// Ask the power manager to nap. It will eventually call back into
// startDream() if/when it is appropriate to start dreaming.
// Because napping could cause the screen to turn off immediately if the dream
// cannot be started, we keep one eye open and gently poke user activity.
long time = SystemClock.uptimeMillis();
mPowerManager.userActivity(time, true /*noChangeLights*/);
//mtk modify begin
try
{
Thread.sleep(5);
}
catch (InterruptedException e) {}
}
//mtk modify end
mPowerManager.nap(time);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
系统设置--显示--互动屏保--选择未点击的屏保方式(万花筒或者时钟)--点击“立即启动”
按键有变色,但是没有出现屏保,再次点击1次或多次才有反应
[SOLUTION]
这個問題的root cause是DreamManagerService文件中的dream函數先調用了userActivity然後,又
調用了Nap,前面一個userActivtiy也會通過消息機制進入handleSanDMAn函數,但是這個函數還沒
有走完,就走了下一次Nap函數,這時Nap函數,修改了WakeFullNess的狀態,然後線程又切換到
handleSandMan,就擾亂了後面又要進來的handleSandMan的執行狀態,所以屬於線程沒有同步好導致
的,由於這個問題無法做同步,所以只能盡量減小這個問題的概率了。
減小 的方法就是讓原來的線程先休眠一會再進入Nap操作,即不會讓原來的handleSandman還沒有執
行完,就開始Nap。主要是不原來的線程搶CPU。
修改方法如下:
請在DreamManagerService.java中做如下的修改(有mtk modify的是新添加的):
@Override // Binder call
public void dream() {
checkPermission(android.Manifest.permission.WRITE_DREAM_STATE);
final long ident = Binder.clearCallingIdentity();
try {
// Ask the power manager to nap. It will eventually call back into
// startDream() if/when it is appropriate to start dreaming.
// Because napping could cause the screen to turn off immediately if the dream
// cannot be started, we keep one eye open and gently poke user activity.
long time = SystemClock.uptimeMillis();
mPowerManager.userActivity(time, true /*noChangeLights*/);
//mtk modify begin
try
{
Thread.sleep(5);
}
catch (InterruptedException e) {}
}
//mtk modify end
mPowerManager.nap(time);
} finally {
Binder.restoreCallingIdentity(ident);
}
}