My application is freezing, how to implement Threads in it?

Could you help me figure out how to implement Threads for this so that it does not freeze while it is waiting for a response from the server? I tried for 5 hours or so, I just can’t find a way to use it in the stream and then return it to set the text using 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(); } } }); } } 
+4
source share
2 answers

AsyncTask is what you are looking for. On the help page:

  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"); } } 

Remember that doInBackground runs in a separate thread, and onPostExecute runs in the user interface thread after doInBackground completes.

+4
source

Put your code that is responsible for the server request on a separate thread:

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

Source: https://habr.com/ru/post/1411405/


All Articles