Android如何在其他类中运行OnUiThread?

时间:2011-10-22 14:54:02

标签: android multithreading asynchronous

在我的应用程序中,在MainActivity中,有一个工作正常的线程。但是,当我调用另一个类从服务器获取数据时,我无法在线程上运行。请参阅下面的代码示例。

class MainActivity extends Activity implements Runnable {

    public void onCreate() {
        new Thread(this).start();
    }

    public void run() {
        //here is code for download data from server after completion this and in handler  i m call other class in setdata() method....
    }

    public void setData() {
        new CheckData(this);
    }
}

class CheckData {
    public CheckData(Context context) {
        context.runUIonthread(){//cant call as runUIthread............
    }
}

6 个答案:

答案 0 :(得分:52)

请参阅文章Communicating with the UI Thread

掌握Context后,您可以在任何课程中创建Handler。否则,您可以调用Looper.getMainLooper(),无论哪种方式,您都可以获得主UI线程。

例如:

class CheckData{
    private final Handler handler;

    public Checkdata(Context context){
       handler = new Handler(context.getMainLooper());
    } 

    public void someMethod() {
       // Do work
       runOnUiThread(new Runnable() {
           @Override
           public void run() {
               // Code to run on UI thread
           }
       });
    }

    private void runOnUiThread(Runnable r) {
       handler.post(r);
    }  
}

答案 1 :(得分:30)

如果您不想传递上下文,这是一个解决方案:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        // code goes here
    }
});

答案 2 :(得分:12)

class MainActivity extends Activity implements Runnable{

    public void oncreate(){
        new Thread(this).start();
    }

    public void  run(){
        //here is code for download data from server after completion this and in handler  i m call other class in setdata() method....
    }

    public void setdata();
    {
        new checkData(this,MainActivity.this);
    }
}

class checkData{

    public void checkdata(Context context,MainActivity mainactivity){
       mainactivity.runUIonthread()..is works fine for me.....
    }   

}

答案 3 :(得分:11)

Activity是一个扩展Context的类。因此,无需传递上下文和活动。您可以将活动作为上下文传递,然后您可以使用上下文在UI线程上运行,如下所示:

((Activity) context).runOnUiThread(new Runnable() {
        public void run() {
            //Code goes here
        }
    });

谨慎之词:只有当您确定上下文是一个活动背景时才使用它,并且假设它不是一个好习惯。

答案 4 :(得分:6)

您可能想看一下AsyncTask。即使它不是最好的解决方案,它也会帮助您入门。

http://developer.android.com/reference/android/os/AsyncTask.html

修改

我不明白为什么使用AsyncTask不是解决方案,但无论如何。您可以保存在UI线程中初始化的Handler类。然后使用此Handler,您可以以runnable的形式将消息回发到UI。因此,当您在UI线程中(在开始新线程之前)然后与其他类共享时,您需要做的就是实例化一个新的Handler对象。完成后,您可以使用该实例使用post方法将消息发布回UI线程。有关更多详细信息,请查看Handler类的文档:

http://developer.android.com/reference/android/os/Handler.html

答案 5 :(得分:2)

如果有人正在寻找基于Rx的解决方案:

Observable.just(true)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(aBoolean -> {
        // cool stuff comes here
    });