Java runOnUiThread and Thread.sleep

4

我有一个来自另一个类的方法,在调用结束时,我的ImageView的颜色从红色变为白色。示例代码如下:

public void endOfCall(){

    ((Activity)mContext).runOnUiThread(new Runnable(){
        @Override
        public void run(){
            TargetDetails.oncall.setVisibility(View.VISIBLE);
            TargetDetails.endcall.setVisibility(View.GONE);
        }
    });

    try{
        call.endCall();
    }catch (SipException se) {}

    call.close();

    //this is just a representation; not the actual code
    if(true){
      Thread.sleep(10000);
    }

    //new intent here
}

问题出现在'if'条件中,我在这个条件里加了Thread.sleep。它会等待10秒钟,在下面的代码被执行之前。
TargetDetails.oncall.setVisibility(View.VISIBLE);
TargetDetails.endcall.setVisibility(View.GONE);

我觉得关于Thread.sleep,我可能有所遗漏。我只是想摆脱它,但除此之外,我不确定是否有其他替代方案。帮帮我,谢谢。


如果你从uiThread调用endOfCall,它会休眠10秒钟,然后完成块并运行挂起的任务,例如可见性更改... - eduyayo
1
为什么线程在这里休眠? - ToYonos
这是流程的一部分...它会睡眠几秒钟(不是真的10秒),然后继续到另一个意图,再次进行调用。这就是为什么我在可见性之后放置了睡眠,因为我认为它会先处理可见性,然后再进行睡眠。 - user3360031
你提到这个方法在一个单独的类中运行,但它是否也在一个单独的线程中运行?如果你在另一个线程的可运行对象中,才应该使用runOnUiThread。 - tutuDajuju
1个回答

6

使用Handler代替让线程休眠。

因此,不要使用if(true) {.....},而是尝试使用以下代码:

Handler h = new Handler();
h.postDelayed(new Runnable() {
    @Override public void run() {
        //new intent here
    }
}, 10000);

好的,我会尝试这个。几分钟后会回复你。谢谢。 - user3360031
它现在可以工作。但是有没有办法知道计数器?比如它已经是1或2等等? - user3360031
你可以扩展 Runnable,使其接受 int 作为构造函数的值,并使用你自定义的 Runnable。 - Pavel Dudka
恐怕我真的没有听懂你在说什么。我是Android编程的新手,所以我还很迷茫。 :( - user3360031

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接