当另一个线程正在工作时,活动在启动时冻结

时间:2019-05-07 04:37:27

标签: android multithreading android-activity client

编辑:正如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();
}

不幸的是,我的活动冻结,直到服务器发出的呼叫返回。

我希望活动能够启动,并且当服务器回答以更新其视图时,不幸的是不会发生这种情况。我不知道为什么。

1 个答案:

答案 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(); 
}