首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AsyncTask不能正常工作(安卓)

AsyncTask不能正常工作(安卓)
EN

Stack Overflow用户
提问于 2019-04-22 06:13:54
回答 1查看 37关注 0票数 0

我正在做一些"sockets-application",我需要帮助。我有一个带有connection-method的类:

代码语言:javascript
复制
public class ClientSocketConnection {

private int port = 49150;
private String host;

public ClientSocketConnection(String host){
    this.host = host;
}

public boolean connect(){
    Boolean isConnected = false;

    AsyncTask<Void, Void, Boolean> asyncProcess = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... voids) {
            try {
                Socket client = new Socket();
                client.connect(new InetSocketAddress(host, port), 1000);
            } catch (IOException ex) {
                Log.d(TAG, "Client socket exception", ex);
                return false;
            }
            return true;
        }
    };

    asyncProcess.execute();

    try {
        isConnected = asyncProcess.get();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return isConnected;
}

我正在尝试在应用程序类中使用AsyncTask建立套接字连接

代码语言:javascript
复制
private void executeRequest(){
    ClientSocketConnection client = new ClientSocketConnection(txtIPAddress.getText().toString());
    AsyncTask<Void, Void, Boolean> connectionTask = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... voids) {
            Log.d(TAG, "Begin");
            boolean flag = client.connect();
            Log.d(TAG, "End");//Not displayed
            return flag;
        }

        @Override
        protected void onPostExecute(Boolean isConnected) {
            if(isConnected){
                Toast.makeText(getApplicationContext(), "Connection established", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "Incorrect IP-Address", Toast.LENGTH_SHORT).show();
            }
        }
    };

    connectionTask.execute();
}

但是executeRequest()中的doInBackground-方法不能完全工作(不显示结束消息)。但是,有趣的是,没有在应用程序类中使用AsyncTask,在主(UI)线程中执行时,一切都很好……

可能的问题是什么?日志中没有错误。应用程序将继续工作...

提前感谢))

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-22 06:26:36

因为您正在调用AsyncTask.get()。这会导致您不是异步的,并且在任务完成之前阻塞。该函数永远不应该被调用。它的用途非常有限,如果你不想做一些非常不寻常的事情,那就错了。这里也没有理由有2个异步任务。

这是你的第二个问题--2个异步任务。所有AsyncTasks都共享同一线程,并以循环方式执行。这意味着在任务1完成之前无法执行任务2--但是任务1正在等待任务2,而任务2永远不会开始。你基本上把自己锁死了。

解决方案:不要使用AsyncTask.get()。将其重写为使用单个AsyncTask,或使用真正的线程(这通常是联网的首选,因为如果您在应用程序中的其他位置使用AsyncTasks,则它们都会被阻塞,等待网络请求完成)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55787237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档