Android AysncTask doInbackground - PullRequest
       40

Android AysncTask doInbackground

0 голосов
/ 08 ноября 2019

Я новичок в Android, я пытаюсь реализовать socket в Android это простое приложение клиент-сервер. где я создал 2 buttons («подключить», «отключить») и с помощью 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"); }
}

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете вызвать execute только один раз для одного экземпляра AsyncTask. new_conn инициализируется только один раз. Теперь, если вы будете пытаться каждый раз создавать новый объект для вызова execute, вы не сможете использовать operator_socket переменную Socket в качестве переменной-члена класса AsyncTask. Вы получаете исключение при вызове execute более одного раза для одного экземпляра AsyncTask

Прочитайте эти документы

...