当屏幕进入睡眠状态时,应用似乎停止工作

Oce*_*lue 9 android

我有一个CPU密集型长时间运行操作(几个小时),我正在使用AsyncTask执行.随着它的继续,它会更新屏幕上的进度条以显示完成任务的百分比.

我发现当我的屏幕进入睡眠状态(超时)时,任务似乎停止了.不确定这是否因为AsyncTask停止或者在尝试更新屏幕时遇到困难(后者我在考虑).

除了永远不让屏幕睡眠,我怎么能阻止我的AsyncTask停止执行?如果这是唯一的方法,那么我如何确保屏幕不睡觉?

编辑:我必须补充一点,我知道这听起来像一个非用户友好的应用程序,由下面的人评论.这是一项非常专业的任务(处理数千个图像文件以比较不同系统上的处理),并由内部的一些用户使用,而不是公开发布.

Ebo*_*ike 23

这是预期的行为.这个想法是,由于应用程序不好,手机的电池不应该耗尽.如果屏幕关闭,用户通常希望手机睡眠.

如果您需要运行应用程序,可以使用WakeLock保持手机运行(屏幕关闭):此处此处的文档.

请注意,唤醒锁定需要WAKE_LOCK权限,同样,您需要向用户说明您的应用程序在关闭时会喝掉手机的奶昔.


Twi*_*eEz 6

不确定是否有人会读这个,因为OP已经好几年了,但是我在同一条船上我需要使用唤醒锁用于内部使用的应用程序,并且让屏幕保持不正常(我只需要cpu因此,我可以运行一些指标查询)我只是使用部分唤醒锁; 即:

public class my_frag extends Fragment {
    WakeLock wl; 


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    setRetainInstance(true);        
    PowerManager pm = (PowerManager) this.getActivity().getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");  

    //I happen to have it in a button click event based on an async task 
    //Side note: I should probably be using a Loader for my Async task but this works fine 
    connectButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (metrics_task != null)
            {
            Status s = metrics_task.getStatus();
            if (s.name().equals("RUNNING")){
                if (metrics_task.running){
                metrics_task.cancel(true);
                connectButton.setText("Start");
                metrics_task.running = false;
                wl.release(); <--releases it on async stop
                }
                else{
                    metrics_task = new start_metrics(ae);
                    metrics_task.execute();
                    wl.acquire(); <--starts it on async start
                }
            }
            else{

                metrics_task = new start_metrics(ae);
                metrics_task.execute();

            }
            }
            else{
                metrics_task = new start_metrics(ae);
                metrics_task.execute();
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

这很好用,没有任何问题