如何在Android中执行特定时间段后的任务



我创建了一个包含大量片段的应用程序。在我的最后一个片段中,我尝试在 10 秒后在LogCat上打印一些东西。但它对我不起作用.

这是我Fragment

public class StepTwentyTwoFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.step22_fragment, container, false);
        testMethod();
        return v;
    }
    public static StepTwentyTwoFragment newInstance() {
        StepTwentyTwoFragment f = new StepTwentyTwoFragment();
        Bundle b = new Bundle();
        f.setArguments(b);
        return f;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser) {
            Activity a = getActivity();
            if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
    public void testMethod(){
        SystemClock.sleep(10000);
        Log.d("PPP : ","456");
    }
}

实际上,我想在启动最后一个片段的10秒后打印此" PPP"。但是随着应用程序中某些片段的加载,它开始打印。

对此有什么想法吗?

谢谢。

你不应该睡觉,也不应该在不需要的时候创建线程。Android的主线程是基于事件循环的,您可以安排事件/代码在未来的某个时间点执行。

最简单的选择是使用

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.step22_fragment, container, false);
    Runnable delayedTask = new Runnable() {
        @Override
        public void run() {
            Log.d("PPP : ","456");
        }
    };
    v.postDelayed(delayedTask, 10000);
    return v;
}

如果没有View也可以创建自己的处理程序。

private static final Handler mainThreadHandler = new Handler(Looper.getMainLooper());
public void testMethod(){
    Runnable delayedTask = new Runnable() {
        @Override
        public void run() {
            Log.d("PPP : ","456");
        }
    };
    mainThreadHandler.postDelayed(delayedTask, 10000);
}

使用 Handler.postDelay 方法来实现此目的。

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 10000ms
  }
}, 10000);

将要执行的代码放在 run() 方法中。从这里阅读有关处理程序的更多信息

可能您正在休眠 ui 线程,这就是您的日志在睡眠结束后出现的原因。

使用计时器和计时器任务。计时器任务在与 ui 线程不同的线程上运行。

Timer timer          = new Timer();
TimerTask timer_task = new TimerTask() {
    @Override
    public void run() {
        Log.d("PPP : ","456");
    }
};
timer.schedule(timer_task, 10000);

试试这个

public void executePeriodicTask() {
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {       
    @Override
    public void run() {
        handler.post(new Runnable() {
            public void run() {       
                try {
                  //Write your code here , which you want to execute periodically
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                }
            }
        });
    }
};
timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms

}

您可以为此简单地创建一个线程或处理程序。

如果要使用线程 ->

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {}
        ((Activity)getActivity()).runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.d("PPP : ","456");
                // Do other Stuff
            }
        });
    }
}).start();

您可以使用Handler PostDelayed传递Runnable

 new Handler().postDelayed(new Runnable(){
        @Override
        public void run() {
             Log.d("PPP : ","456");
        }
    }, 10000);

相关内容

  • 没有找到相关文章

最新更新