【问题标题】:how to wake a thread from sleep in android如何在android中将线程从睡眠中唤醒
【发布时间】:2012-08-01 09:45:37
【问题描述】:

我有一个等待用户按下图像的活动。如果用户在 3 秒内没有按任何内容,我希望活动关闭(完成())。 这是我的代码:

private final int delay = 3000;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.after_hangup);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    final ImageView pressToLaunchbrowser = (ImageView) findViewById(R.id.after_hang_up_image);

    pressToLaunchbrowser.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);   // if we want to open the device.
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            startActivity(intent);
            Thread.interrupted();
        }
    }); 
    new Thread() {
        public void run() {
            try {
                    Thread.sleep(delay);
                    finish();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }.start();
}}

我的问题是,如果按下了,我如何唤醒线程?我试过Thread.interrupted(); 但它不起作用。如果我按下与否,线程仍然等待 3 秒。谢谢!

【问题讨论】:

    标签: android multithreading onclick sleep


    【解决方案1】:

    Android中不建议使用线程。。使用Handler来管理时间相关的操作。。例如,代替new Thread()..,试试

    Handler handler = new Handler();
    handler.postDelayed('runnable-that-will-finish-activity', 3000);
    

    在 onclicklistener 中:

    handler.remove('runnable-that-will-finish-activity') ;
    

    【讨论】:

    • 你的解决方案非常优雅。
    • 谢谢作者,在你的runnable中,别忘了在主线程上执行finish()
    • 谢谢!但我对这一切有点陌生......你能不能!告诉我我该怎么做?我没有得到'runnable-that-will-finish-activity'。
    • 只需将 'runnable-that-will-finish-activity' 替换为 new Runnable() { //doStuff }。您要做的就是完成()活动。
    【解决方案2】:
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.widget.ImageView;
    
    public class NewActivity extends Activity {
    
        private final int delay = 3000;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.after_hangup);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
            final ImageView pressToLaunchbrowser = (ImageView) findViewById(R.id.after_hang_up_image);
    
            final Handler handler = new Handler();
            handler.postDelayed(finishRunnable, delay);
            pressToLaunchbrowser.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
                    // // if we want to open the device.
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    handler.removeCallbacks(finishRunnable);
                }
            });
    
        }
    
        private Runnable finishRunnable = new Runnable() {
    
            @Override
            public void run() {
                finish();
    
            }
        };
    }
    

    【讨论】:

    • 不只是转储代码,你能解释一下吗?提供一些细节供后人学习?
    • 所有重要的事情都在下面的答案中进行了解释
    • 您应该将该文本复制到此答案的顶部,因为此答案已被接受。
    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2014-07-29
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多