例如,如果我有一个线程做昂贵的东西,并且从该线程我想在Main(activity)类中触发runOnUiThread。显然我不应该创建我的活动类(Main)的实例。所以,如果我尝试
Main.runOnUiThread(mRunnable);
从我的线程中它给了我一个错误,说它不是一个静态方法,因此无法以我的方式访问它。现在我的理解是活动类几乎几乎以静态方式访问 我该怎么做?
(顺便说一句:我这样做是因为我得到 CalledFromWrongThreadException,只有创建视图层次结构的原始线程可以触及它的视图)
答案 0 :(得分:3)
您应该使用Handler课程。处理程序类在UI线程上运行。当您在线程中完成工作后,请致电handler.sendEmptyMessage()
,从那里您可以对您的ui进行更改。
private final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// make changes to ui
}
}
答案 1 :(得分:3)
Raunak有正确的想法。我只想补充一点,你也可以在方法sendEmptyMessage中指定一个整数作为处理程序的标识符。这将允许您创建一个可以处理所有UI更新的处理程序,例如
public static final int EXAMPLE = 0;
public static final int ANOTHER_EXAMPLE = 1;
private final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch( msg.what ){
case EXAMPLE:
//Perform action
break;
case ANOTHER_EXAMPLE;
//Perform action
break;
}
}
}
//Call to submit handler requesting the first action be called
handler.sendEmptyMessage(EXAMPLE);
希望这有帮助!
答案 2 :(得分:3)
你的问题并没有真正提供足够的细节,但从事情的声音来看,你是在你的活动中的私人内部类(Runnable?)(主要)。如果是这种情况,您可以写:
Main.this.runOnUiThread(mRunnable);
或
runOnUiThread(mRunnable); //will see that there is no runOnUiThread in the current class and begin looking "upwards"
此外,您可能希望查看AsyncTask,特别是在UI线程上运行的onPostExecute
,onPreExecute
和onProgressUpdate
回调中。
答案 3 :(得分:2)
首先在onCreate之外创建一个runnable。像这样:
private Runnable myRunnable = new Runnable() {
@Override
public void run() {
//work to be done
}
};
然后使用:
调用runnablerunOnUiThread(myRunnable);
答案 4 :(得分:0)
对于那些正在寻找简单即时解决方案的人来说,请按照简单的步骤进行操作
在onCreate()
方法
MyClass obj;
在onCreate()
方法
obj = MyClass.this;
致电runOnUiThread()
obj.runOnUiThread(new Runnable() {
public void run() {
//perform your UI tasks here
}
});
希望它有所帮助。
答案 5 :(得分:0)
以上所有答案都不是很正确。
1)如果你想从任何线程代码库在UI线程上运行一段代码。你可以做: Looper.getMainLooper()。post(new Runnable(...))
因为Looper.getMainLooper()是一个静态变量并在ActivityThread中初始化。
2)如果您的可运行代码段在活动中 然后你可以使用:
MainActivity.this.runOnUiThread(...)