请按照以下步骤操作
使用Runnable继承的Actor类创建
public abstract class Actor implements Runnable {
Actor(int queueSize){
}
@Override
public void run() {
onInit();
}
void onInit(){
// do stuff here
}}
然后我使用Actor创建MyRunner类
class MyRunner extends Actor{
MyRunner() {
super(10);
}}
然后在我的活动中,按如下方式使用runOnUiThread
Actor runner = new MyRunner();
runOnUiThread(runner);
然后,主线程冻结,整个屏幕为黑色,应用程序被冻结。
我用this thread来实现我的代码
我错过了哪里?
答案 0 :(得分:4)
这是因为您正在runnable
上在MainThread
上执行runOnUiThread
,应该在后台线程中运行actor
,让它完成工作并在以下情况下发布结果您需要用MainThread
或runOnUiThread
来Handler
例如:
public abstract class Actor implements Runnable {
Actor(int queueSize){
// empty block
}
@Override
public void run() {
onInit();
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// hello ui i'm done with my job!!
}
});
}
void onInit(){
// do stuff here
}
}
创建一个Executor
private static final int POOL_SIZE_DEFAULT = 4;
private static final int POOL_SIZE_MAX = 10;
private static final int TIME_OUT = 30;
private ThreadPoolExecutor = mThreadPoolExecutor = new ThreadPoolExecutor(POOL_SIZE_DEFAULT,
POOL_SIZE_MAX,
TIME_OUT,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(POOL_SIZE_DEFAULT));
然后execute
您的actor
:
mThreadPoolExecutor.execute(runner);
答案 1 :(得分:0)
问题是我没有正确使用runOnUiThread
机制。
在Android develop中,它解释得很好。
在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。
runOnUiThread
所做的是向mainThread
中添加一条消息,指出我们需要在运行时执行什么,并且这不应是一个冻结mainThread
的漫长过程。