AsyncTask是什么
AsyncTask 允许对用户界面执行异步操作。 它会先阻塞工作线程中的操作,然后在 UI 线程中发布结果,而无需您亲自处理线程和/或处理程序。
其实AsyncTask就是安卓帮我们对异步处理机制进行了封装的一个类,方便我们进行异步操作。
1、可以使用泛型指定参数类型、进度值和任务最终值
2、方法 doInBackground() 会在工作线程上自动执行
3、onPreExecute()、onPostExecute() 和 onProgressUpdate() 均在 UI 线程中调用
4、doInBackground() 返回的值将发送到 onPostExecute()
5、您可以随时在 doInBackground() 中调用publishProgress(),以在 UI 线程中执行 onProgressUpdate()
6、您可以随时取消任何线程中的任务
必须实现doInBackground(),此处代码不在主线程(UI线程)运行,参数类型为泛型参数的第一个(另外注意参数是可变参数):
private class ClientTask extends AsyncTask<String,Void,String>
{
@Override
protected String doInBackground(String... params) {
}
}
Socket是什么
Socket是网络连接时使用的接口。有服务器端和客户机端:ServerSocket用于服务器端,Socket是客户端
服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求(accept是阻塞式的)
③ accept获得一个连接(socket实例)后,可以通过输入流读取客户端发送的信 息,通过输出流向客户端发送乡音信息
④通常用死循环保证一直在线
客户端
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 可以通过输出流想服务器端发送信息,通过输入流获取服务器响应的信息
简单的实例
下面来做一个简单的实例,首先构建一个服务器,它只接收来自客户端的信息并把它显示在textView当中
服务器端
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
final int port = 6688;
protected TextView textView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.text);
//实例化一个AsyncTask,并开启
ServerTask serverTask = new ServerTask();
serverTask.execute(port);
}
public class ServerTask extends AsyncTask<Integer,String,Void> {
String msgFromClient = null;
String expMsg = null;
@Override
protected Void doInBackground(Integer... port) {
try {
while(true)
{
msgFromClient = "";
ServerSocket serverSocket = new ServerSocket(port[0]);//占用端口6688
Socket client = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String line;
while((line = bufferedReader.readLine()) != null)
{
msgFromClient = msgFromClient + line;
}
serverSocket.close();
//利用publishProgress更新UI,把当前接收的信息显示出来
publishProgress(msgFromClient == null ? "get nothing" : msgFromClient);
}
}catch (Exception e)
{
expMsg = e.getMessage();
Log.d("network","Server can't connected");
}
return null;
}
@Override
protected void onProgressUpdate(String... msg) {
super.onProgressUpdate(msg);
textView.setText(msg[0]);
}
}
}
客户端:
输入要连接的服务器IP地址以及要发送的内容,点击send发送到服务器端
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
EditText textView = null;
EditText ipText= null;
Button button = null;
String port = "6688";
String ip = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (EditText)findViewById(R.id.text);
button = (Button)findViewById(R.id.button);
ipText = (EditText)findViewById(R.id.IPtext);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClientTask clientTask = new ClientTask();
//传入IP地址,端口号,以及要发送的内容
clientTask.execute(ipText.getText().toString(),port,textView.getText().toString());
}
});
}
private class ClientTask extends AsyncTask<String,Void,String>
{
//ip = string[0] port = string[1] text_toSend = string[2]
@Override
protected String doInBackground(String... params) {
try {
Socket socket = new Socket(params[0],Integer.parseInt(params[1]));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
printWriter.println(params[2]);
printWriter.flush(); //记得刷新缓冲区
socket.close();
}catch (IOException e)
{
Log.d("network",e.getMessage());
}
return "OK";
}
}
}