Замораживание активности при запуске, пока другой поток выполняет работу - PullRequest
0 голосов
/ 07 мая 2019

Редактировать: Как отмечают Майк М., Владислав Матвиенко и Вивек Мишра

new Runnable().run(); 

не является отдельной темой. Спасибо, ребята:)

Редактировать конец.

Когда я запускаю новую активность, которая использует отдельный поток для связи с сервером, он зависает.

Я начинаю новую активность с

Intent i = new Intent(this, AcmActivity.class);
startActivityForResult(i, acm_ui);

затем я запускаю асинхронный вызов моего клиентского класса в onCreate()

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.acm);

        //get the client implementation
        ClientImpl client = ServiceManager.getService(ClientImpl.class);
        client.getData(new PrivateClientCallback())
}

private class PrivateClientCallback implements GeneralCallback {
        @Override
        public void ok(final String response) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    updateSomeView(response);
                }
            });
        }
}

ClientImpl.getData () выглядит следующим образом:

public synchronized void getData(GeneralCallback cb) {
        new Runnable() {
            @Override
            public void run() {
                //allow networking within this Thread
                //read more here: https://stackoverflow.com/questions/25093546/android-os-networkonmainthreadexception-at-android-os-strictmodeandroidblockgua
                if (android.os.Build.VERSION.SDK_INT > 9) {
                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                    StrictMode.setThreadPolicy(policy);
                }

                //send some stuff to server and use the Callback
                String stuff = someStuff();
                cb.ok(stuff);
            }.run();
}

К сожалению, моя активность останавливается до тех пор, пока не будет возвращен звонок с сервера.

Я ожидаю, что действие запустится, и когда сервер ответит, чтобы обновить свои представления, к сожалению, этого не происходит. Понятия не имею почему.

1 Ответ

1 голос
/ 10 мая 2019

new Runnable () это просто обычный объект.Вам нужно создать новый поток с работающим объектом.Тогда он будет работать в отдельном потоке.

Проверьте код ниже

public synchronized void getData(GeneralCallback cb) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //allow networking within this Thread
                //read more here: https://stackoverflow.com/questions/25093546/android-os-networkonmainthreadexception-at-android-os-strictmodeandroidblockgua
                if (android.os.Build.VERSION.SDK_INT > 9) {
                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                    StrictMode.setThreadPolicy(policy);
                }

                //send some stuff to server and use the Callback
                String stuff = someStuff();
                cb.ok(stuff);
            }).start(); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...