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 im call other class in setdata() method.... } public void setData() { new CheckData(this); } } class CheckData { public CheckData(Context context) { context.runUIonthread(){//cant call as runUIthread............ } } 

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

С помощью 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); } } 

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

 new Handler(Looper.getMainLooper()).post(new Runnable() { public void run() { // code goes here } }); 
 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 im 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..... } } 

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

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

Word of Caution: используйте это только в том случае, если вы уверены, что контекст – это контекст активности, и это не очень хорошая практика.

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

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

РЕДАКТИРОВАТЬ

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

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