你能帮我弄清楚如何实现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();

}

}

});

}

}

解决方法:

AsyncTask正是您要找的.从帮助页面:

private class DownloadFilesTask extends AsyncTask {

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完成后onPostExecute在UI线程中运行.

标签:java,android,multithreading,freeze

来源: https://codeday.me/bug/20190621/1249867.html

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐