AsyncTask异步线程简单讲解
在这里呢简单的讲一下刚刚学过的Android的异步线程,以及简单的示例:
以下就是AsyncTask的标准定义方法了,可以通过new一个对象来调用此方法,本文章仅仅讲述极为简单的方法
public abstract class AsyncTask<Params, Progress, Result>
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。
好了知道了以上三个参数的定义我们来看一下具体的方法吧
这里就不讲解onPreExecute()方法了,它主要是用来开始doInBackground(Params… params)前对UI的操作。此方法如果不需要可以忽略
第一个是doInBackground(Params… params),在**onPreExecute()**完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress… values)来更新进度信息。
第二个是onProgressUpdate(Progress… values),在调用publishProgress(Progress… values)时,接收由publishProgress传来的参数,这个方法是跨线程的。
第三,execute(Params… params),开始异步线程。
这就是最基础的异步线程方法了,另外的在异步线程的使用中还有以下几点需要特别注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params… params)方法必须在UI线程中调用。
3.不要在doInBackground(Params… params)方法里面去更新UI
4.一个异步线程只能更新一次。
下面是自己写的绝对简单的异步线程Socket,只要学过socket相信一定能看懂,当然还需要一些Android基础,相信找到这篇文章的你们一定都具有这两个条件了吧,话不多说
直接上代码:
public class MainActivity extends AppCompatActivity {
private Button button1,button2;
TextView textView;
EditText editText1,editText2,editText3;
//创建所需要的UI控件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ID();//实例化UI控件
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
connect();
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
send();
//创建全局变量Socket,bufferedReader,bufferedWriter
Socket socket=null;
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
public void connect(){
//创建一个新的异步线程传入Void,String,VOid
AsyncTask asyncTask =new AsyncTask() {
@Override
protected Void doInBackground(Void... voids) {
//此方法中不可以更新UI,,切记
//通过文本输入框来输入将要连接的IP地址以及端口
socket =new Socket(editText2.getText().toString().trim(),Integer.parseInt(editText1.getText().toString().trim()));
//将getXXXX包装成bufferedXXX
bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
bufferedWriter =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
publishProgress("success");
//传输字符串准备更新UI
} catch (UnknownHostException e1) {
publishProgress("low");
}catch (IOException e){
publishProgress("low");
//文件输入流,通过publishProgress发送
String data =null;
while((data=bufferedReader.readLine())!=null){
publishProgress(data);
}catch (IOException e){
e.printStackTrace();
return null;
@Override
protected void onProgressUpdate(String... values) {
if(values[0].equals("success"))
//如果传进来的参数与success相匹配则弹出连接成功的提示
Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
if(values[0].equals("low"))
Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
//通过传来的信息展示在UI控件上
textView.append("别人说:"+values[0]+"\n");
super.onProgressUpdate(values);
//启动异步线程
asyncTask.execute();
public void send(){
try {
//更新UI以及文件输出流
textView.append("我说:"+editText3.getText().toString().trim()+"\n");
// bufferedWriter.write(Data, 0, Data.length());
bufferedWriter.write(
editText3.getText().toString().trim()+"\n");
bufferedWriter.flush();
editText3.setText(" ");
}catch (IOException e){
e.printStackTrace();
public void ID(){
//实例化控件
button1 =(Button)findViewById(R.id.connect);
button2=(Button)findViewById(R.id.send);
textView =(TextView)findViewById(R.id.tv);
editText1 =(EditText)findViewById(R.id.com);
editText2=(EditText)findViewById(R.id.ip);
editText3=(EditText)findViewById(R.id.editText);
布局文件也粘上叭
<LinearLayout
android:layout_width="match_parent"
android:layout_height="58dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="44dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="IP:"
android:gravity="center_horizontal"/>
<EditText
android:id="@+id/ip"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:ems="10"
android:inputType="textPersonName" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="62dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="端口号"
android:gravity="center_horizontal"/>
<EditText
android:id="@+id/com"
android:layout_width="wrap_content"
android:layout_height="72dp"
android:layout_weight="1"
android:ems="10"
android:inputType="textPersonName" />
</LinearLayout>
<Button
android:id="@+id/connect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="连接" />
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.85" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送" />
Dome:Socket 异步
AsyncTask异步线程简单讲解在这里呢简单的讲一下刚刚学过的Android的异步线程,以及简单的示例:以下就是AsyncTask的标准定义方法了,可以通过new一个对象来调用此方法,本文章仅仅讲述极为简单的方法public abstract class AsyncTask<Params, Progress, Result>三种泛型类型分别代表“启动任务执行的输入参数”、“...
1项目中接口需要使用socket网络请求,大概有十几个接口。之前用过rxjava简单封装过些简单的http请求的接口,
现在也想按照那种思维模式老封装一下。总体思路是发送数据时传一个bean过去,接收时直接返回已经解析好的
bean,用面向对象的方法编程。如果像以前一样一个工具类中写死好多socket请求的方法,这样耦合性太强,牵一发动全身。 所以使用rxjava 2.0小小封装一下。
2:核...
@Override
protected List<Address> doInBackground(String... params) {
Geocoder geocoder = new Geocoder(context);
List<Address> addresses = null;
try {
addresses = geocoder.getFromLocationName(params[0], 1);
} catch (IOException e) {
e.printStackTrace();
return addresses;
@Override
protected void onPostExecute(List<Address> addresses) {
super.onPostExecute(addresses);
if (addresses != null && addresses.size() > 0) {
Address address = addresses.get(0);
// 处理地址信息
} else {
// 处理地址解析失败的情况
在使用时,只需要创建异步线程对象并调用 `execute` 方法即可:
```java
GeocodeAsyncTask task = new GeocodeAsyncTask();
task.execute("北京市海淀区中关村大街27号");
需要注意的是,由于 `getFromLocation` 方法需要访问网络,因此需要在 AndroidManifest.xml 文件中添加如下权限:
```xml
<uses-permission android:name="android.permission.INTERNET" />
CSDN-Ada助手:
Java Kotlin 循环反射 一行代码完美实现多层反射
yaowang1235345:
Java Kotlin 循环反射 一行代码完美实现多层反射
暮暮韶尘染:
关于Android分享过滤某一APP的方法
qq_36575517:
关于Android分享过滤某一APP的方法
大家一起学编程(python):