Делайте некоторые вещи с Android-интерфейсом в не-пользовательском интерфейсе - PullRequest
8 голосов
/ 03 июня 2011

Есть ли способ сделать изменения пользовательского интерфейса в не-пользовательском потоке? Короткий вопрос.

Ответы [ 6 ]

9 голосов
/ 03 июня 2011

Либо используйте Обработчик , либо используйте код ниже

    runOnUiThread(new Runnable()
    {           
        @Override
        public void run()
        {
            // Ui Stuff here                
        }
    });
5 голосов
/ 24 июня 2011

Если вы не хотите использовать AsyncTask, попробуйте шаблон наблюдателя с внутренним классом (ResponseHandler) в своей основной деятельности, извините, я не смог правильно отформатировать, но я уверен, что вы поняли идею

public class WorkerThread extends Observable implements Runnable {
public void run() {
    try {
            DoSomething();
            String response = "Doing something";
            setChanged();
            notifyObservers( response );
            DoSomethingElse();
            String response = "Doing something else";
            setChanged();
            notifyObservers( response );
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
private void DoSomething(){
}
private void DoSomethingElse(){
}


public class MainActivity{
public class ResponseHandler implements Observer {
    private String resp;
    public void update (Observable obj, Object arg) {
        if (arg instanceof String) {
            resp = (String) arg;
            //Write message to UI here ie System.out.println("\nReceived Response: "+ resp );
            //or EditText et = (EditText)findViewById(R.id.blah);
            // blah.SetText(resp);
        }
    }
}
private void doStuffAndReportToUI(){
    final WorkerThread wt = new WorkerThread();
    final ResponseHandler respHandler = new ResponseHandler();
    wt.addObserver( respHandler );
    Thread thread = new Thread(wt);
    thread.start();
}
5 голосов
/ 03 июня 2011

Есть много способов сделать это, используйте AsyncTask или Threads .Короткий ответ.

Подсказка: пользовательский интерфейс можно выполнить в классе pre-postExecute / runOnUiThread / Handler

0 голосов
/ 18 августа 2014

Я пытался + tmho ответить, но все равно выдает эту ошибку:

E / AndroidRuntime (****): android.view.ViewRootImpl $ CalledFromWrongThreadException: только оригинальный поток, создавшийиерархия представлений может касаться его представлений.

Я, наконец, в конечном итоге комбинирую это с + ingsaurabh способом, вот так:

private class ResponseHandler implements Observer, Runnable {

    Activity act;

    public ResponseHandler(Activity caller) {
        act = caller;
    }

    @Override
    public void update (Observable obj, Object arg) {
        act.runOnUiThread(this);
    }

    @Override
    public void run() {
        //update UI here
    }
}

спасибо вам обоим.

0 голосов
/ 03 июня 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...