2012-05-08 12 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スレッドの更新を警告するには、Handlerなどを使用する必要があります。 –

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、およびdoInBackground完了後にUIスレッドでonPostExecute実行されることを覚えておいてください。

関連する問題