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............
}
}
Ответы
Ответ 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