相关文章推荐
侠义非凡的闹钟  ·  SAS岩论 | ...·  1 年前    · 
大力的黑框眼镜  ·  Docker ...·  1 年前    · 

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&lt;Params, Progress, Result&gt;三种泛型类型分别代表“启动任务执行的输入参数”、“...
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中的循环反射技术,并分享更多实用且高效的代码实现。也可以考虑分享如何利用反射技术实现动态代理等高级编程技术。期待你的下一篇博客,继续为CSDN社区贡献价值! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 Java Kotlin 循环反射 一行代码完美实现多层反射 yaowang1235345: 学到了,收藏一波~,期待大佬回访! Java Kotlin 循环反射 一行代码完美实现多层反射 暮暮韶尘染: 表情包哇哦,博主真的太厉害了,帮我解决了大问题,我要跟你生猴子,家庭地址给一下表情包 关于Android分享过滤某一APP的方法 qq_36575517: 很好,很强大 关于Android分享过滤某一APP的方法 大家一起学编程(python): 确认过眼神,是值得学习的人