【问题标题】:How to start an activity from a thread class in android?如何从android中的线程类启动活动?
【发布时间】:2011-06-08 05:42:14
【问题描述】:

我正在扩展一个线程类,我想从该类开始一个活动。如何做到这一点?

【问题讨论】:

    标签: android multithreading android-activity


    【解决方案1】:

    您需要在应用程序的主线程上调用startActivity()。一种方法是执行以下操作:

    1. 初始化一个Handler 并将其与应用程序的主线程相关联。

      Handler handler = new Handler(Looper.getMainLooper());
      
    2. 将启动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 不是线程,而是指一个活动。
    • @AndroidDev 呃……什么?此答案正确描述了如何从后台线程启动活动。 MyActivity.this 只是对当前活动上下文的引用(如果需要,您可以将其更改为 MyActivity.this.getApplicationContext(),但这并不重要)。这里要了解的主要内容是,您不能从后台线程调用startActivity() 方法,因为它可能会导致奇怪的竞争条件。相反,您需要向主线程的消息队列发布一个 runnable,以便在主线程上执行。这有意义吗?
    • 大家好,我应该如何在已经启动的线程上启动活动。上面的代码显示了创建一个线程然后启动它。是我应该以这种方式开始我的线程还是有其他方式??
    • @Manpreet 上面的代码“显示如何创建线程然后启动它”在哪里?上面的代码根本没有提到创建/启动线程,所以我不确定你的意思。
    • 这是不正确的。调用 run 方法时不会创建新线程。可运行对象被放入主线程的消息队列中,以便稍后执行。当消息被执行时,主线程会简单的调用runnable的run()方法。不涉及线程创建。后台线程只是告诉主线程只要有机会就执行可运行对象。由于主线程一个接一个地依次执行runnables,我们保证不会出现竞争条件。
    【解决方案2】:

    你可以使用类似这样的东西。

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

    【讨论】:

    • @iberck:感谢您的指出。那是我刚开始 android 开发时的帖子。我现在意识到,那是严重且令人反感的错误代码。我已经更新了。
    • 这仍然过于复杂......没有必要覆盖handleMessage。只需发布一个可在主线程上执行的可运行文件。可运行文件将包含启动活动的代码。
    • @AlexLockwood:同意你的看法。这是最简单的方法!
    【解决方案3】:

    要开始一个类的活动,根据我的说法,一个类应该扩展活动。

    但是如果你想用一些线程函数来启动活动,你可以做这些事情。

    使用实现 Runnable 代替扩展 Thread。之后,一些具有 Activity 的类,您只需调用启动线程并输入您的逻辑并启动 Intent。

    我认为这对你来说是一个很好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多