Редактировать: Как отмечают Майк М., Владислав Матвиенко и Вивек Мишра
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();
}
К сожалению, моя активность останавливается до тех пор, пока не будет возвращен звонок с сервера.
Я ожидаю, что действие запустится, и когда сервер ответит, чтобы обновить свои представления, к сожалению, этого не происходит. Понятия не имею почему.