2012-06-13 4 views
0

내 서버 컴퓨터와 내 안드로이드 스마트 폰간에 통신 시스템을 만들려고합니다. 나는 마침내 좋은 결과를 얻고있다. 그러나, 나는 안드로이드 전망에 문제가있다. 특히, 확장이없는 클래스의 텍스트 뷰의 ".setText()"메서드를 사용하려고합니다. 내 textview 개체를 해당 클래스로 전달했지만 "textview.setText()"메서드는 아무런 오류없이 UI에 아무런 영향을주지 않고 작동합니다. 코드를 작성해 보겠습니다. 좀 더 명확하게 이해하고 코드를 시험해 볼 수있는 기회를 갖게 될 것입니다.다른 클래스를 통한 텍스트 뷰 편집

public class NetworkingActivity extends Activity { 

    public static String message; 
    public static EditText editext; 
    public static TextView textview; 
    private Connector connector; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 


    public void buttonClicked(View v){ 
     editext = (EditText) findViewById(R.id.editText1); 
     textview = (TextView) findViewById(R.id.textview); 
     message = editext.getText().toString(); 

     connector = new Connector(NetworkingActivity.this); 
     connector.start(); 

    } 

    public void yenile(String respond){ 
     textview.setText(respond); 
     editext.setText(""); 

    } 

    public void yenileClicked(View v){ 
     textview.setText(Connector.respond); 
     editext.setText(""); 

    } 

    public static class Connector extends Thread{ 
     private static final int PORT = 3588; 
     private static final String IpAddress = "XXX.XXX.XXX.XXX"; // of course X's have a int value 
     public static String respond; 
     private NetworkingActivity activity; 

     public Connector(NetworkingActivity activity){ 
      this.activity = activity; 
     } 

     public void run() { 

      try { 

       Socket socket = new Socket(IpAddress, PORT); 

       PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); 
       Scanner scanner = new Scanner(socket.getInputStream()); 

       writer.println(NetworkingActivity.message); 
       respond = scanner.nextLine(); 


       activity.yenile(respond); 

       socket.close(); 
      } catch (Exception e) { 

      } 

     } 

    } 
} 

마지막으로, 한 가지 더 말씀 드리겠습니다. 메소드 yenileClicked()는 버튼을 통해 "android : onClick ="yenileClicked "인 ​​xml 파일의 코드에 의해 지정됩니다. 문제는 다른 클래스의 장애가 거의 같은 방법으로 진행된다는 것입니다. yenile();

+2

문제는 별도의 스레드에서보기를 편집 할 수 없다는 것입니다. http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable) 이렇게하면 'activity.runOnUIThread (new Runnable {public void run() {activity .0enile (respond);}}); ' 현재 코드 작업을 수행합니다. 전체 활동을 전달하는 대신 인터페이스 콜백을 만드는 것이 좋습니다 ... –

답변

0

다음 중 하나를 사용할 수 있습니다

  1. 사용 runOnUiThread을.

  2. 사용 귀하의 경우 아마도 가장 쉬운 Handler.post

  3. : 여기에 아주 적합하지 textview.post

  4. 를 사용하지만, 유사한 작업을 위해 너무 좋을 수 : asycnTask를 사용합니다.