Android Activity.runOnUiThread不是静态的,那我怎么用呢?

时间:2011-09-24 14:01:20

标签: android multithreading user-interface android-activity static

例如,如果我有一个线程做昂贵的东西,并且从该线程我想在Main(activity)类中触发runOnUiThread。显然我不应该创建我的活动类(Main)的实例。所以,如果我尝试

 Main.runOnUiThread(mRunnable);

从我的线程中它给了我一个错误,说它不是一个静态方法,因此无法以我的方式访问它。现在我的理解是活动类几乎几乎以静态方式访问 我该怎么做?

(顺便说一句:我这样做是因为我得到 CalledFromWrongThreadException,只有创建视图层次结构的原始线程可以触及它的视图

6 个答案:

答案 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线程上运行的onPostExecuteonPreExecuteonProgressUpdate回调中。

答案 3 :(得分:2)

首先在onCreate之外创建一个runnable。像这样:

private Runnable myRunnable = new Runnable() {
        @Override
        public void run() {

                        //work to be done

        }
    };

然后使用:

调用runnable
runOnUiThread(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(...)