2015-04-02 41 views
2

我有MainActivity和我的单独班级,名字是MyClass。我想在MyClass中运行一些代码。我在MyClass有这方法。在MyClass的构造函数中,我通过ContextMainActivity类,并将其转换为ActivityContextAndroid - 从UI线程切换回来?

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()中完成此操作。有什么方法可以再次切换回当前线程?

感谢

+0

_I想再次切换到当前thread_这意味着在UI线程运行后,你想回到MyClass的背景? – Kushal 2015-04-02 04:16:18

+0

是的正确...! – 2015-04-02 04:18:40

+1

如果不在单独的Thread中使用'MyClass'类,那么不需要使用'runOnUiThread',因为所有代码都在同一线程上运行 – 2015-04-02 04:19:43

回答

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()); 
+0

中所解释的那样...!非常感谢 – 2015-04-02 05:47:40

1

一旦从runOnUiThread()访问API进行PubNub,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; 
    // ... 
    } 
+0

我想切换回runOnUiThread块中的当前线程 – 2015-04-02 04:28:05

+0

为什么你想这样做明确。如果你执行'runOnUiThread()'部分的所有代码并且什么都不做,那么android系统会自动在当前线程的后面部分执行。所以,无论你想从'runOnUiThread()'部分调用,这个调用可以从外部进行,正如我在回答 – Kushal 2015-04-02 04:31:07

1

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

runOnUiThread方法传递需要有一个不同的线程引用UI线程用于更新视图或其他UI组件中的信息。

要在原始类中运行代码,您应该执行一些操作。首先,你应该将它定义为一个单独的类(在另一个文件中,而不是私有类)。

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

另一种选择是创建一个HandlerThread以在您希望运行UI时运行。

你是不是你的用例完全清楚......

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