【发布时间】:2011-06-08 05:42:14
【问题描述】:
我正在扩展一个线程类,我想从该类开始一个活动。如何做到这一点?
【问题讨论】:
标签: android multithreading android-activity
我正在扩展一个线程类,我想从该类开始一个活动。如何做到这一点?
【问题讨论】:
标签: android multithreading android-activity
您需要在应用程序的主线程上调用startActivity()。一种方法是执行以下操作:
初始化一个Handler 并将其与应用程序的主线程相关联。
Handler handler = new Handler(Looper.getMainLooper());
将启动Activity 的代码封装在匿名Runnable 类中,并将其传递给Handler#post(Runnable) 方法。
handler.post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent (MyActivity.this, NextActivity.class);
startActivity(intent);
}
});
【讨论】:
MyActivity.this 只是对当前活动上下文的引用(如果需要,您可以将其更改为 MyActivity.this.getApplicationContext(),但这并不重要)。这里要了解的主要内容是,您不能从后台线程调用startActivity() 方法,因为它可能会导致奇怪的竞争条件。相反,您需要向主线程的消息队列发布一个 runnable,以便在主线程上执行。这有意义吗?
run()方法。不涉及线程创建。后台线程只是告诉主线程只要有机会就执行可运行对象。由于主线程一个接一个地依次执行runnables,我们保证不会出现竞争条件。
你可以使用类似这样的东西。
public class MyActivity extends Activity
{
Handler hander = new Handler(){
public void handleMessage(Message m){
Intent intent = new Intent (MyActivity.this, Next.class);
startActivity(intent);
}
};
pubilc void onCreate(Bundle ic)
{
//your code setContentView() etc....
Thread toRun = new Thread()
{
public void run()
{
hander.sendMessage(1);
}
}
toRun.start();
}
}
【讨论】:
handleMessage。只需发布一个可在主线程上执行的可运行文件。可运行文件将包含启动活动的代码。
要开始一个类的活动,根据我的说法,一个类应该扩展活动。
但是如果你想用一些线程函数来启动活动,你可以做这些事情。
使用实现 Runnable 代替扩展 Thread。之后,一些具有 Activity 的类,您只需调用启动线程并输入您的逻辑并启动 Intent。
我认为这对你来说是一个很好的解决方案。
【讨论】: