2014-11-06 95 views
1

我的问题是:当我调试类似于如下的代码时:等待UI作业结束(Android)

someSpinner.setSelection(0); someEditText.setEnabled(true);

然后我看到第一个动作实际上是在第二个动作之后执行的。我的猜测是,微调控制动作被放入某种不立即启动的异步作业中。我的目标是等到第一个动作完成后再运行第二个动作。 任何人都知道如何实现这一点?

在Eclipse RCP我解决这个类似以下内容:

uiJob1.addJobChangeListener(new JobChangeAdapter() { 
    @Override 
    public void done(IJobChangeEvent event) { 
     if (event.getResult().isOK()) { 
     uiJob2.schedule(); 
     } else { 
      ... 
     } 
    } 
    }); 

    // 2 
    uiJob2.addJobChangeListener(new JobChangeAdapter() { 
    @Override 
    public void done(IJobChangeEvent event) { 
     if (event.getResult().isOK()) { 
     ... 
     } else { 
     ... 
     } 
    } 
    }); 

    uiJob1.schedule(); 
+0

您正在考虑错误的方式。但不能说正确的方法是因为你没有说**为什么**和**你想要做什么**。以某种方式等待UI更新完成,但绝对是多线程,asycnh OOP环境中的一个有缺陷的设计。 – Simon 2014-11-06 21:11:31

回答

0

其实,这是很常见的Android版:你不能保证所有的动作将发生在同步模式 - 又名顺序你已经将它们执行到代码中 - 当它们是事件驱动的时候。

我想你应该尝试在您的微调添加OnItemSelectedListener()监听器,看看该事件也被捕获你的行动:someSpinner.setSelection(0);

spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
     // your code here 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) { 
     // your code here 
    } 

}); 

让我知道这可能是工作。

感谢, 保罗

0

感谢您快速的解答,保罗。

我已经在微调器上有一个OnItemSelectedListener。在这个监听器中,有一种情况是我正在执行someEditText.setEnabled(false)。由于命令没有在同步模式下执行,我的第一篇文章(someEditText.setEnabled(true);)的第二个动作没有效果: -/

我发现通过调用someSpinner.setSelection(0,false );它在someEditText.setEnabled(true)之前执行;但我不想依赖这个“解决方案”...

+0

你可以给我发一些代码吗?我对这种情况非常感兴趣,并且想尝试使用getViewTreeObserver()。 – Paul 2014-11-07 09:32:05