Подтвердить что ты не робот

Android, как запуститьOnUiThread в другом классе?

В моем приложении в 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............
    }
}
4b9b3361

Ответ 1

См. статью Общение с потоком пользовательского интерфейса.

С Context в руке вы можете создать Handler в любом классе. В противном случае вы можете вызвать Looper.getMainLooper(), в любом случае, вы получите поток основного интерфейса.

Например:

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);
    }  
}

Ответ 2

Здесь решение, если вы не хотите передавать контекст:

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

Ответ 3

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.....
    }   

}

Ответ 4

Активность - это класс, расширяющий контекст. Поэтому нет необходимости передавать как контекст, так и активность. Вы можете передавать активность как контекст, а затем вы можете использовать контекст для запуска в потоке пользовательского интерфейса следующим образом:

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

Слово предостережения: используйте это только в том случае, если вы уверены, что контекст является контекстом активности, и это не рекомендуется делать.

Ответ 5

Возможно, вы захотите взглянуть на AsyncTask. Даже если это не лучшее решение, это поможет вам начать работу.

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

ИЗМЕНИТЬ

Я не понимаю, почему использование AsyncTask не является решением для вас, но в любом случае. Вы можете удерживать класс обработчика, который инициализируется в потоке пользовательского интерфейса. Затем с помощью этого обработчика вы можете отправлять сообщения обратно в пользовательский интерфейс в виде runnable. Таким образом, все, что вам нужно сделать, это создать новый объект Handler, когда вы находитесь в потоке пользовательского интерфейса (перед тем, как начать новый), а затем передайте его другому классу. Когда вы закончите, вы можете использовать этот экземпляр, чтобы отправить сообщение обратно в поток пользовательского интерфейса, используя метод post. Для получения дополнительной информации ознакомьтесь с документацией класса Handler:

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