编辑:正如Mike M.和Vladyslav Matviienko和Vivek Mishra所指出的
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();
}
不幸的是,我的活动冻结,直到服务器发出的呼叫返回。
我希望活动能够启动,并且当服务器回答以更新其视图时,不幸的是不会发生这种情况。我不知道为什么。
答案 0 :(得分:1)
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();
}