활동

2014-10-11 12 views
0

코드 첫번째 TextView.setText()에 달려 :활동

public class MyActivity extends Activity { 

    Button send; 
    TextView textv; 
    String answer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 

     send = (Button)findViewById(R.id.sendButton); 
     textv = (TextView)findViewById(R.id.textViewv); 

     send.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) {  
       MyClientTask myClientTask = new MyClientTask("localhost", 1234, "QUESTION"); 
       myClientTask.execute(); 
      } 
     });  
    } 


    void processAnswer() { 
     Log.i("DEBUG", "in processAnswer - before setting text"); 
     Log.i("DEBUG", "ANSWER"); 

     textv.setText("ANSWER\n"); // <-------- H E R E ----------- 

     Log.i("DEBUG", "in processAnswer - after setting text"); 
    } 



    public class MyClientTask extends AsyncTask<Void, Void, Void> { 

      String dstAddress; 
      int dstPort; 

      String message; 
      String response; 

      MyClientTask(String addr, int port, String msg){ 
      dstAddress = addr; 
      dstPort = port; 
      message = msg; 
      response = ""; 
      } 

      @Override 
      protected Void doInBackground(Void... arg0) { 

      Socket socket = null; 

      try { 
       InetAddress serverAddr = InetAddress.getByName(dstAddress); 

       socket = new Socket(serverAddr, dstPort); 
       OutputStream out = socket.getOutputStream();  
       out.write(message.getBytes()); 
       out.flush(); 

       String msgrc = ""; 
       int charsRead = 0; 
       char[] inputBuf = new char[4096]; 

       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader in = new BufferedReader(isr); 
       while ((charsRead = in.read(inputBuf)) != -1) { 
         msgrc += new String(inputBuf).substring(0, charsRead); 
       } 

       // outer class variable 
       MyActivity.this.answer = msgrc; 

       out.close(); 
       is.close(); 
       socket.close(); 


       Log.i("DEBUG", "before processing answer"); 
       MyActivity.this.processAnswer(); 
       Log.i("DEBUG", "after processing answer"); 

      } catch (Exception e) { 

      } 

      return null; 
      } 
    } 
} 

코드 위 단순히 서버에 어떤 메시지를 보내고 응답을받습니다. 이 대답은 TextView에 표시되어야합니다 (표시된 선 참조). 그러나 LogCat 디스플레이에서 해당 앱이 멈 춥니 다.

[...] 
before processing answer 
in processAnswer - before setting text 
ANSWER 

그러면 LogCat에 더 이상 행이 기록되지 않습니다. 아무에게도 그 이유가 설명되어 있니? 표시된 줄을 주석 경우 대신 onPostExecute()MyActivity.this.processAnswer()에 전화를 이동하는 경우, 로그 캣이

[...] 
before processing answer 
in processAnswer - before setting text 
ANSWER 
in processAnswer - after setting text 
after processing answer 
+0

여기서 로그 변수는 코드에서 선언 되었습니까? –

+0

죄송합니다. textv 여야합니다. 코드를 수정했습니다. – user236012

+0

여기서 textv는 할당 되었습니까? 당신이 잡으려고 노력했기 때문에 예외는 아닙니다. 응용 프로그램이 nullpointer 예외를 던지고 있습니다 –

답변

0

처럼 보이는, 아마도 그것은 작동 할 수 있습니다 - 는 IIRCUI 스레드에있는 항목 만에서 업데이트해야합니다 UI 스레드

+0

매력처럼 작동합니다! 감사. 귀하의 설명에 따르면, "onPostExecute"는 메인 스레드에 의해 실행되는 반면 "doInBackground"는 별도의 스레드에 의해 실행됩니까? – user236012

+0

맞습니다 - onPreExecute도 있습니다 – Shadru

0

먼저 텍스트보기를 다음과 같이 초기화하십시오. doInBackground 메소드 아래에 onPostExecute 메소드를 추가하십시오. 그리고 거기에 텍스트를 설정하십시오. 벨로우즈는 내가 바꾸는 코드입니다.

public class MyActivity extends Activity { 

Button send; 
TextView textv; 
String answer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_activity); 

    send = (Button)findViewById(R.id.sendButton); 
    textv = (TextView)findViewById(R.id.textview); 

    send.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) {  
      MyClientTask myClientTask = new MyClientTask("localhost", 1234, "QUESTION"); 
      myClientTask.execute(); 
     } 
    });  
} 



public class MyClientTask extends AsyncTask<Void, Void, Void> { 

     String dstAddress; 
     int dstPort; 

     String message; 
     String response; 

     MyClientTask(String addr, int port, String msg){ 
     dstAddress = addr; 
     dstPort = port; 
     message = msg; 
     response = ""; 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 

     Socket socket = null; 

     try { 
      InetAddress serverAddr = InetAddress.getByName(dstAddress); 

      socket = new Socket(serverAddr, dstPort); 
      OutputStream out = socket.getOutputStream();  
      out.write(message.getBytes()); 
      out.flush(); 

      String msgrc = ""; 
      int charsRead = 0; 
      char[] inputBuf = new char[4096]; 

      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader in = new BufferedReader(isr); 
      while ((charsRead = in.read(inputBuf)) != -1) { 
        msgrc += new String(inputBuf).substring(0, charsRead); 
      } 

      // outer class variable 
      MyActivity.this.answer = msgrc; 

      out.close(); 
      is.close(); 
      socket.close(); 


      Log.i("DEBUG", "before processing answer"); 
      MyActivity.this.processAnswer(); 
      Log.i("DEBUG", "after processing answer"); 

     } catch (Exception e) { 

     } 

     return null; 
     } 


     @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

     textv.setText(msgrc); 

    } 
} 
} 
+0

onPostExecute의 서명은 "protected void onPostExecute (Void result)"이어야합니다 --- 코드 "MyActivity.this.processAnswer()"는 "onPostExecute"로 이동되어야합니다. Shadru에 대한 답변을 참조하십시오. 감사! – user236012

+0

도움이되는 경우 내 대답을 편집했습니다 내 대답 – Harshad07

+0

나는,하지만 충분하지 않은 평판을 upvote : / – user236012