0

Galaxy S3でアプリをデバッグしていますが、処理を監視するたびに..アプリの処理負荷が非常に高いことに気付きます。アプリケーションの処理が 80% になることもあり、これは信じられないほど高い

コードは次のとおりです。

package com.example.socketclient;



import android.app.Activity;
import android.os.Bundle;

import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.io.InputStreamReader;
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import android.util.Log; 

public class SocketCode extends Activity {
    private boolean connected = false;
    //private Handler handler = new Handler();
    public TextView txt;
    int doit=0;
    protected SocketCore Conn;
    public Button b;
    public EditText TextToSend;
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_socket_code);
        b = (Button)findViewById(R.id.button1);
        txt = (TextView)findViewById(R.id.textView1);
        TextToSend = (EditText)findViewById(R.id.editText1);
        //Conn = new SocketCore(this,txt);
        b.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                 Log.e("ErrorButton","Button Pressed Before Toggle"+doit);  
             doit=1;
             Log.e("ErrorButton","Button Pressed "+doit);
            }
        }); 

        Thread cThread = new Thread(new ClientThread());
        cThread.start();

    }
    public class ClientThread implements Runnable {
        Socket socket ;
String finall="",text;
PrintWriter out = null;
BufferedReader in = null;

        public void run() {
            try {
                InetAddress serverAddr = InetAddress.getByName("192.168.0.150");
                Log.d("ClientActivity", "C: Connecting...");
                socket= new Socket(serverAddr,4444);
                connected = true;

                while (connected) {
                    try {



                      if(doit==1)
                      {
                          Log.e("ErrorButton","If");

                          out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); 
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));                

                        out.println(TextToSend.getText().toString());
                       finall="";
                        while ((text = in.readLine()) != null) {
                            finall += text;
                            Log.e("Test","Final: "+finall);
                          if(text=="quit")
                          {
                              socket.close();
                          }
                      Log.e("ClientActivity", "After Read "+doit+" "+finall);

                       break;
                      } 

                      doit=0;

                      Log.e("ClientActivity", "Out Of IF "+doit);
                    runOnUiThread(new Runnable() {
                        public void run() {
                            txt.setText(finall);
                        }
                    });

                      }     



                    } catch (Exception e) {
                        Log.e("ClientActivity", "S: Error", e);
                    }

                }
                socket.close();
                txt.setText("Closed Socket");
                Log.d("ClientActivity", "C: Closed.");
            } catch (Exception e) {
                Log.e("ClientActivity", "C: Error", e);
                connected = false;
            }
        }

        public void ClientHandler(String Send)
        {
            try{
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                       .getOutputStream())), true);
           out.println(Send);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            finall = in.readLine();

            txt.setText(finall);
            }
            catch(IOException e)
            {txt.setText("Exception");}
        }


    }


}
4

2 に答える 2

1

ランナブルをUIスレッドにフィードし続けるノンストップループを実行しているため、CPUはこれを実行しているため、CPUは非常に高い負荷をかけ続けます。代わりに、サーバーが新しいデータをデバイスにプッシュしたときにアプリがウェイクアップするGCM(Google Cloud Messaging)などのポーリング戦略ではなく、プッシュ戦略の使用を検討することをお勧めします。それが不可能な解決策である場合は、ポーリングレートをより低いレートに調整し、1分あたり数回(またはそれ以下)に制限します。run()で定期的にThread.sleep()を使用して、UIスレッドが次のようにフラッディングしないようにします。ランナブル。

于 2012-11-26T21:41:57.680 に答える
0

Thread.Sleep(200); を使用して修正しました。

while (connected) {
                    try {
                        Thread.sleep(200);
                        Log.e("ErrorButton","If");
                      if(doit==1)
                      {
于 2012-11-27T18:24:37.943 に答える