如何在Android中的某个时间段后执行任务?
How to execute a task after a certain time period in Android?
我创建了一个包含大量片段的应用程序。在我的最后一个片段中,我尝试在 LogCat
after 10 seconds 上打印一些东西。但它对我不起作用。
这是我的Fragment
class
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。 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
}
您可以简单地为此创建一个线程或处理程序。
如果你想使用Thread ->
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.postDelayed方法实现。
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 10000ms
}
}, 10000);
将要执行的代码放在 运行() method.Read here
中有关处理程序的更多信息
你不应该休眠,也不应该在不需要时创建线程。 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);
}
我创建了一个包含大量片段的应用程序。在我的最后一个片段中,我尝试在 LogCat
after 10 seconds 上打印一些东西。但它对我不起作用。
这是我的Fragment
class
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。 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
}
您可以简单地为此创建一个线程或处理程序。
如果你想使用Thread ->
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.postDelayed方法实现。
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 10000ms
}
}, 10000);
将要执行的代码放在 运行() method.Read here
中有关处理程序的更多信息你不应该休眠,也不应该在不需要时创建线程。 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);
}