Мое приложение зависает, как реализовать Threads в нем?

Не могли бы вы помочь мне понять, как реализовать Threads, чтобы он не замерзал, пока он ждет ответа с сервера? Я пробовал в течение 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(); } } }); } } 

Solutions Collecting From Web of "Мое приложение зависает, как реализовать Threads в нем?"

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 запускается в отдельном потоке, а onPostExecute запускается в потоке пользовательского интерфейса после завершения doInBackground .

Поместите свой код, который отвечает за запрос сервера на отдельный поток:

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