62,615
社区成员
发帖
与我相关
我的任务
分享
public void refreshAccessToken(boolean force) throws vDiskException
{
synchronized (UiApplication.getEventLock())
{
if (force) // || !isAccessTokenValid()) {
{
setAccessToken(null);
if (Application.isEventDispatchThread())
{
UiApplication.getUiApplication().pushModalScreen(new LoginScreen());
} else {
UiApplication.getApplication().invokeLater(new Runnable() {
public void run() {
UiApplication.getUiApplication().pushModalScreen(new LoginScreen());
}
});
}
if (!hasAccessToken()) {
throw new vDiskException("Unable to refresh the Access Token");
}
}
}
}
@Override
public void run() {
for (<initial>; <condition>; <change>) {
if (Thread.interrupted()) {
// tell progress monitor that progress is interrupted/canceled
return;
}
// tell progress monitor that progress is updated
// content
}
// tell progress monitor that progress is done.
}
synchronized (ACCESS_TOKEN_LOCK) {
if (!hasAccessToken())
{
refreshAccessToken(true);
try {
ACCESS_TOKEN_LOCK.wait(vDiskConfig.AUTHORIZE_TIMEDOUT);
} catch (InterruptedException e) {}
}
}
我的要求就是必须等LoginScreen返回之后才能继续后边的操作,不能同步执行。。。。。我对这个多线程不是很明白,所以代码有些莫名其妙,见笑了
public void refreshAccessToken(boolean force) throws vDiskException
{
synchronized (UiApplication.getEventLock())
{
if (force) // || !isAccessTokenValid()) {
{
setAccessToken(null);
if (Application.isEventDispatchThread())
{
UiApplication.getUiApplication().pushModalScreen(new LoginScreen());
} else {
UiApplication.getApplication().invokeAndWait(new Runnable() {
public void run() {
UiApplication.getUiApplication().pushModalScreen(new LoginScreen());
}
});
// 可能会有 checked exception 需要处理
}
if (!hasAccessToken()) {
throw new vDiskException("Unable to refresh the Access Token");
}
}
}
}
如果这样改导致死锁,那可能是因为我对 synchronized (UiApplication.getEventLock()) 不了解,并且你这部分的线程设计可能有问题。