android AysncTask doInbackground

Posted

技术标签:

【中文标题】android AysncTask doInbackground【英文标题】: 【发布时间】:2020-03-05 08:23:25 【问题描述】:

我是 android 新手,我正在尝试在 android 中实现 socket,它是一个简单的客户端-服务器应用程序。 我创建了 2 buttons ("connect", "disconnect"),并使用 AysncTask doInBackground 我正在连接到服务器并与服务器断开连接,但它仅适用于连接,当我试图断开我的应用程序时不幸关闭。 下面是我的mainactivity 代码。 感谢您的帮助

package com.example.sockettest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import java.io.*;
import java.util.*;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.lang.String;
class conn extends AsyncTask<String, Void, Void>


    Socket operator_socket;
    @Override
    protected Void doInBackground(String... voids)  
        String str;
        str = voids[0];
        if (str.equals("conn")) 
            try 
                operator_socket = new Socket("192.168.0.103", 6666);

            catch (UnsupportedEncodingException e)  e.printStackTrace(); 
             catch (UnknownHostException e)  e.printStackTrace(); 
             catch (IOException e)  e.printStackTrace(); 
         else if (str.equals("CC"))
            try 
                operator_socket.getOutputStream().write("EX".getBytes("US-ASCII"));
                operator_socket.close();
             catch (UnsupportedEncodingException e)  e.printStackTrace(); 
              catch (UnknownHostException e)  e.printStackTrace(); 
              catch (IOException e)  e.printStackTrace(); 
         else 

        
    return null;
    


public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    conn new_conn = new conn();
    public void connect_operator(View v)
            new_conn.execute("conn");
    
    public void close_conn(View v) new_conn.execute("CC"); 


【问题讨论】:

你遇到了什么错误? @user1506104 无法执行任务:任务已经执行(一个任务只能执行一次) 【参考方案1】:

您只能对 AsyncTask 的一个实例调用一次执行。 new_conn 仅被初始化一次。现在如果你每次调用execute都尝试创建一个新对象,你将无法使用operator_socketSocket变量作为AsyncTask类的成员变量。在单个 AsyncTask 实例上多次调用 execute 时出现异常

Read these docs

【讨论】:

以上是关于android AysncTask doInbackground的主要内容,如果未能解决你的问题,请参考以下文章

AysncTask更新progressbar

Android开发之使用AsyncTask实现实时翻译

半期考试 之 多线程2

半期考试 之 多线程2

半期考试 之 多线程2

Android多线程分析之一:使用Thread异步下载图像