Android - 从UI线程切换回来?

时间:2015-04-02 04:13:43

标签: java android multithreading android-activity

我有MainActivity和我的单独课程,名称是MyClass。我想在MyClass中运行一些代码。我在MyClass中有相应的方法。在MyClass的构造函数中,我传递了Context类的MainActivity并将Context转换为Activity

MyClass.java

    private Context context;
    private Activity activity;

    public MyClass(Context context) {
      this.context = context;
      this.activity = (Activity) context;
    }

    public void MyFunction() {
     activity.runOnUiThread(new Runnable() {
        public void run() {

          // Code
        }
    });
   }

这里的一切都很顺利。在runOnUiThread中,我编写了一些代码。有一种情况,执行runOnUiThread()正文后,我想回到MyClass上下文。我希望这只能在runOnUiThread()中完成。有没有办法再次切换回当前线程?

由于

4 个答案:

答案 0 :(得分:2)

您可以使用ρяσѕρєяK或Kushal发布的答案之一。这是我的2美分,让事情变得清晰。

runOnUiThread内的所有代码都将在UI线程上执行,不能分为两部分;一个在UI线程上运行,另一个在不同的线程/上下文中运行。现在,如果您想在runOnUiThread完成后执行代码块,那么您可以修改runOnUiThread函数,如下所示(如此处的一些答案所示):

public void MyFunction() {
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // Add code to run on UI-Thread here
        }
    });
    // Add code to run on non UI-Thread here (i.e. on the calling Thread)
}

答案 1 :(得分:1)

runOnUiThread()访问PubNub的API后,android系统会自动将处理切换到当前线程并执行外部语句:

    public void MyFunction() {
     activity.runOnUiThread(new Runnable() {
        public void run() {

          // Code which runs on MAIN UI thread
        }
    });
    // once upper part is done, switching to current thread
    // these statements will be execute on current thread
    // statement 1;
    // ...
   }

答案 2 :(得分:1)

如果在活动类中定义并实现自定义类,除非您创建新线程,否则所有代码都将在UI线程中运行。

runOnUiThread方法传递必要的信息,让不同的线程引用UI线程来更新视图或其他UI组件。

要在原始课程中运行代码,您应该做一些事情。首先,您应该将其定义为一个单独的类(在另一个文件中,而不是私有类)。

其次,您应该将Activity(可能是WeakReference)传递给它,然后使用Activity方法" runOnUiThread"必要时。

另一种选择是创建HandlerThread以便在您希望它运行时运行用户界面。

您对用例并不完全清楚......

答案 3 :(得分:1)

我从问题中得到的是你需要在UI线程中运行一些代码,在后台线程中运行一些代码。是的,您可以修改MyClass以使用Handler,如下所示。

private Context context;
private Handler backgroundHandler;
private Handler uiHandler;

public MyClass(Context context, Handler handler) {
  this.context = context;
  // this.activity = (Activity) context;
  this.uiHandler = handler;

  HandlerThread handlerThread = new HandlerThread("MyClass.Handler");
  handlerThread.start();
  backgroundHandler = new Handler(handlerThread.getLooper());
}

public void MyFunction() {
    uiHandler.post(new Runnable() {
        public void run() {

          // Code to execute on ui thread

            backgroundHandler.post(new Runnable() {
                public void run() {
                  // Code to execute on bg thread
                }
            });           
        }
    });
}

Handler传递给:

MyClass myClass = new MyClass(context, new Handler());