2012-11-26 2 views
0

내 갤럭시 S3에서 내 애플 리케이션을 디버깅 중이며 처리를 모니터링 할 때마다 .. 앱 처리가 매우 높습니다. 코드 응용 프로그램 처리가 여기안드로이드 소켓 스레드 프로세서에서 매우 높은 부하를 추가하십시오.

매우 높이입니다 때로는 80 %에 간다입니다 : CPU는하고있다

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");} 
     } 


    } 


} 

답변

1

당신은 UI 스레드로 공급보다 Runnable를 유지하는 논스톱 루프를 실행하고 있기 때문에 따라서 CPU는 매우 높은 부하를 유지합니다. 대신 서버가 새로운 데이터를 기기에 푸시 할 때 앱이 깨어나는 GCM (Google Cloud Messaging)과 같은 폴링 전략 대신 푸시 전략을 사용하는 것이 좋습니다. 이것이 가능한 해결책이 아니라면 폴링 속도를 낮추고 run()에서 주기적으로 Thread.sleep()를 사용하여 분당 몇 번으로 제한하여 UI 스레드에 범람을 피할 수 있습니다. 실행.

+0

고마워요. Thread.sleep을 사용하여 수정 됨 –

0

고정 Thread.Sleep (200);

while (connected) { 
        try { 
         Thread.sleep(200); 
         Log.e("ErrorButton","If"); 
         if(doit==1) 
         {