在我的应用程序中,在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............
}
}
答案 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
});