使用AsyncTask进行套接字

xXJohnRamboXx

我有这个android代码:

private class myTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {

       try {

             client = new Socket("192.168.1.2", 4444); 
             oos = new ObjectOutputStream(client.getOutputStream());
             ois = new ObjectInputStream(client.getInputStream());

             oos.writeUTF("LOGIN");
             oos.flush();

             String emailText = email.getText().toString();
             oos.writeUTF(emailText);
             oos.flush();

             String passwordText = password.getText().toString();
             oos.writeUTF(passwordText);
             oos.flush();

             string = ois.readUTF();

       }catch (ConnectException e){
           return "Host not found";
       }catch (IOException e) {
           return "Exception Caught";
       }
       return null;
    }

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);   

        if ("Host not found".equalsIgnoreCase(result)){ 
            Toast.makeText(getApplicationContext(), "Host not found" ,Toast.LENGTH_LONG).show();
        }else if("Exception Caught".equalsIgnoreCase(result)){
            Toast.makeText(getApplicationContext(), "Connection error" ,Toast.LENGTH_LONG).show();
        }else{
             Toast.makeText(getApplicationContext(), "Connection established" ,Toast.LENGTH_LONG).show();
        }
        Toast.makeText(getApplicationContext(), string ,Toast.LENGTH_LONG).show();
        if(string.equals("Login successfully Done!")){
            startActivity(new Intent(Login.this, User.class));
        }

    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    register = (TextView)findViewById(R.id.register);
    login = (Button)findViewById(R.id.login);
    email = (EditText)findViewById(R.id.email);
    password = (EditText)findViewById(R.id.password);
    connection = (TextView)findViewById(R.id.connection);



    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    register.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View arg0) {
            startActivity(new Intent(Login.this, Register.class));
        }
    });

    login.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            new myTask().execute();

        }
    });
}

但是,每次我单击登录按钮时,我的连接就会创建。我希望我的应用程序在启动时连接到服务器,然后当我按登录按钮时,它将请求发送到服务器。

谢谢

加布·塞尚

我认为最简单的方法是从AsyncTasks移到Threads。在onCreate函数中创建一个新线程,该线程创建并连接套接字,然后让其等待UI线程的通知(最简单的方法是等待信号量或消息队列)。然后让按钮的onClick通知套接字线程它需要登录。使用这种设计,您可以在启动时将其连接,但只有在您请求时才能登录。

您最大的担心是服务器是否由于不活动而使连接超时。但是我认为您可以控制服务器来防止这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用全双工套接字通信进行SSL重新协商

来自分类Dev

使用套接字的IllegalBlockingModeException

来自分类Dev

使用套接字的HTTP请求

来自分类Dev

从Android使用HTTP或套接字

来自分类Dev

使用SocketAsyncEventArgs进行异步套接字操作时超时

来自分类Dev

使用bin_prot进行套接字通信

来自分类Dev

在Windows上使用套接字

来自分类Dev

使用套接字进行以太网通信的最佳实践

来自分类Dev

如何进行套接字通信?

来自分类Dev

使用选择模型与套接字进行python聊天

来自分类Dev

recv和recvfrom,使用python进行套接字编程

来自分类Dev

对UDP套接字使用shutdown()

来自分类Dev

使用增量与套接字轮询

来自分类Dev

使用asynctask android连接到套接字

来自分类Dev

Android套接字应用程序中的AsyncTask

来自分类Dev

正确使用Appengine套接字

来自分类Dev

在非套接字上进行send()套接字操作

来自分类Dev

在Android中使用套接字?

来自分类Dev

使用Java套接字进行读/写

来自分类Dev

AsyncTask创建一个套接字

来自分类Dev

使用套接字的单个实例进行所有调用

来自分类Dev

使用套接字进行以太网通信的最佳实践

来自分类Dev

使用NSStream进行Objective-C套接字编程

来自分类Dev

使用UDP套接字时进行端口转发?

来自分类Dev

通过使用控制套接字的中间主机进行SSH

来自分类Dev

使用 UDP 进行 Java 套接字编程

来自分类Dev

使用 Pickle 在 Python 中进行套接字编程

来自分类Dev

使用套接字进行 Java 登录

来自分类Dev

套接字 - 使用选择超时