2012-05-08 2 views
4

스레드를 구현하는 방법을 알아 내면 서버에서 응답을 기다리는 동안 정지하지 않을 수 있습니까? 5 시간 정도 시도한 적이 있습니다. 스레드에서이 메서드를 사용하는 방법을 찾지 못한 다음 tv.setText();로 텍스트를 설정하기 위해 반환합니다.내 응용 프로그램이 얼어 붙은 채로 스레드를 구현하는 방법은 무엇입니까?

package zee.rhs.dk; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class AndroidClientActivity extends Activity { 

private String ip = "90.184.254.246"; 
private int port = 8081; 
private String line; 
private TextView tv; 
private Button btn; 
private Socket socket; 

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

    tv = (TextView) findViewById(R.id.tv); 
    btn = (Button) findViewById(R.id.btn); 
    btn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      BufferedReader in = null; 
      PrintWriter out = null; 
      try { 
       socket = new Socket(ip, port); 
       out = new PrintWriter(socket.getOutputStream(), true); 
       out.println("update"); 

       in = new BufferedReader(new InputStreamReader(socket 
         .getInputStream())); 

       while ((line = in.readLine()) == null) { 
       } 
       tv.setText(line); 

      } catch (UnknownHostException e) { 
       Toast.makeText(AndroidClientActivity.this, 
         "Can't reach ip: " + ip, Toast.LENGTH_LONG).show(); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       Toast.makeText(AndroidClientActivity.this, 
         "Accept failed at port: " + port, Toast.LENGTH_LONG) 
         .show(); 
       e.printStackTrace(); 
      } finally { 
       out.close(); 
      } 
     } 
    }); 
} 
} 
+0

당신은'out.println ("update");'뒤에'out.flush(); – srkavin

+0

http://developer.android.com/resources/articles/painless-threading.html – kmb64

답변

1

코드를 넣고, 그 별도의 스레드로 서버에 요청을 담당 :

Thread thread = new Thread() { 
    @Override 
    public void run() { 
     try { 
      // put your socket operations here 
     } catch (InterruptedException e) { 
      // handle exception if you need 
     } 
    } 
}; 

thread.start(); 
+0

이 문제는 사용자가 UI 스레드가 아닌 다른 스레드에서 UI를 변경할 수 없다는 것입니다. UI 스레드 뷰 업데이트에 경고하기 위해 핸들러 또는 다른 것을 사용해야합니다. –

4

AsyncTask은 당신이 찾고있는 것입니다. 도움말 페이지에서 :

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

doInBackground 완료 후 UI 스레드에서이 별도의 스레드에서 doInBackground 실행하고 onPostExecute 실행을 기억하십시오.

관련 문제