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

Sam*_*iya 29 multithreading android 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............
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_* T. 56

请参阅与UI线程进行通信的文章.

随着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);
    }  
}
Run Code Online (Sandbox Code Playgroud)

  • 构造函数没有返回值.Java类名称应以大写字母BTW开头.尽管有小错误,但您的回答很有帮助! (3认同)

The*_*rga 32

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

new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        // code goes here
    }
});
Run Code Online (Sandbox Code Playgroud)


Sam*_*iya 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.....
    }   

}
Run Code Online (Sandbox Code Playgroud)


Shu*_*ary 11

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

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

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


Sav*_*sis 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