当子线程执行完,提交到主线程执行代码(UIUtils)

来源:互联网 发布:淘宝婴童装主营怎么写 编辑:程序博客网 时间:2024/05/16 14:32
/**
* 在主线程中 执行代码
*
* @param runnable
*/
public static void runOnUiThread(Runnable runnable) {
// 如果在主线程中运行 直接运行 如果没有在 提交一个handler
if (isRunUIThread()) {
runnable.run();
} else {
executeTask(runnable);
}
}
 
/**
* 可以执行一个任务
*
* @param runnable
*/
public static void executeTask(Runnable runnable) {
getHandlder().post(runnable);
}
 
/**
* 延时执行的异步任务
*
* @param runnable
* @param delayMillis
*/
public static void executeDelay(Runnable runnable, long delayMillis) {
getHandlder().postDelayed(runnable, delayMillis);
}
 
private static Handler getHandlder() {
return MyApplication.getHandler();
}
 
/**
* 判断程序是否在主线程当中运行
*
* @return
*/
public static boolean isRunUIThread() {
// myPid 当前的进程 myUid 当前的用户 myTid 当前的一个线程
return android.os.Process.myTid() == getMainThreadId();
}
 
private static int getMainThreadId() {
 
return MyApplication.getMainThreadId();
}
使用demo:
// 实际上和handler一样 执行完上面的方法 把接下来的代码提交到主线程来执行
UIUtiles.runOnUiThread(new Runnable() {
 
@Override
public void run() {
showPage();
}
});
取消一个异步任务:
/**
* 取消异步任务
*
* @param autoRunningTask
*/
public static void cancelTask(Runnable r) {
getHandlder().removeCallbacks(r);
}
使用方法:
@Override
public void run() {
//取消之前的任务
UIUtiles.cancelTask(this);
int currentItem = viewPager.getCurrentItem();
currentItem++;
// true 平滑的滑动到指定条目
viewPager.setCurrentItem(currentItem, true);
// this就是执行当前的任务 这是一个递归的过程
UIUtiles.executeDelay(this, delayMillis);
}
0 0
原创粉丝点击