0

バックグラウンドスレッドの処理結果に応じてUIを変更する必要があるAndroidアプリを開発しています。最初に次のコードを試しました:

        Thread run_time = new Thread (){
            public void run(){
                ConnectToServer connect = new ConnectToServer(null);
                while(true){
                        String server_response = connect.getServerResponse();
                        if(!server_response.equals(null)){  
                            setResponse(server_response);
                            response_received();
                    }
                }
            }
        };
        run_time.start();

しかし、そのバックグラウンド スレッドからUIを変更しようとしたため、アプリがクラッシュし、その方法を試しました。

        runOnUiThread(new Runnable() {
            public void run(){
                ConnectToServer connect = new ConnectToServer(null);
                while(true){
                        String server_response = connect.getServerResponse();
                        if(!server_response.equals(null)){
                            setResponse(server_response);
                            response_received();
                    }
                }
            }
        });

しかし、私はその例外を得ました:

01-29 16:42:17.045: ERROR/AndroidRuntime(605): android.os.NetworkOnMainThreadException
01-29 16:42:17.045: ERROR/AndroidRuntime(605):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
01-29 16:42:17.045: ERROR/AndroidRuntime(605):     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:151)
01-29 16:42:17.045: ERROR/AndroidRuntime(605):     at libcore.io.IoBridge.recvfrom(IoBridge.java:503)
01-29 16:42:17.045: ERROR/AndroidRuntime(605):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
01-29 16:42:17.045: ERROR/AndroidRuntime(605):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)

検索後、これらの問題を回避するためにコードを実行する必要があることがAsyncTaskわかりましたが、それを使用しようとすると、すべてのrun_timeをバックグラウンドで実行するスレッドとは異なり、小さなタスクでのみ使用する必要があることがわかりました。

したがって、run_time全体でバックグラウンドでスレッドまたはタスクを実行し、その変更をUIに反映するのに最適な日はいつですか。

4

4 に答える 4

0

最適化には「ルーパー」とともに「ハンドラー」が必要です。例:

public void myMethod(){
    Thread background = new Thread(new Runnable(){
        @Override
        public void run(){
            Looper.prepare();
            //Do your server process here
            Runnable r=new Runnable() {
                   @Override
                   public void run() {
                                            //update your UI from here
                   }
            };
            handler.post(r);
            Looper.loop();
        }
    });
    background.start();
}

そしてもちろん、これは AsyncTask を使用しない場合です

于 2014-01-29T15:12:47.907 に答える