Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在安卓系统中,如何在一段时间后执行任务?_Java_Android_Android Fragments_System Clock - Fatal编程技术网

Java 在安卓系统中,如何在一段时间后执行任务?

Java 在安卓系统中,如何在一段时间后执行任务?,java,android,android-fragments,system-clock,Java,Android,Android Fragments,System Clock,我创建了一个包含大量片段的应用程序。在我的最后一个片段中,我尝试在10秒后在LogCat上打印一些东西。但这对我不起作用 这是我的片段类 public class StepTwentyTwoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

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

这是我的
片段

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”。但随着应用程序中一些片段的加载,它开始打印

你对此有什么想法吗


谢谢。

您可能正在睡眠ui线程,这就是为什么睡眠结束后会显示日志的原因

使用定时器和定时器任务。TimerTask在与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);

使用Handler.postdayed方法来实现这一点

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

  }
}, 10000);

将要执行的代码放在run()方法中。请阅读

中有关处理程序的详细信息。您不应该睡眠,也不应该在不需要线程时创建线程。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;
}
如果没有
视图
,也可以创建自己的处理程序

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);
}

不要睡觉。您可以使用
onCreateView
中的
View v
方法安排一个
Runnable
,最终打印日志消息。或者您可以使用一个处理程序。@zapl:用一个例子解释更多。非常感谢亲爱的。@Barrier
onCreateView
在片段重新出现时并不总是被调用(因为视图并不总是被重新创建)。将其移动到
onStart
onResume
。很好,但我们可以改用
AlarmManager
吗?