i am making an android socket app to communicate with the server for creating accounts, and i noticed i have to do this in AsyncTask sub class, even when i seperate it to another class without UI,but i am terribly confused how can i use AsyncTask on this, is there any one expert here who can help me please?

this is the code:

public class AccountCreator extends Activity {

public AccountCreator(){
 super();
 }
// for I/O
ObjectInputStream sInput;       // to read from the socket
ObjectOutputStream sOutput;     // to write on the socket
 Socket socket;
public static String LOGTAG="Lifemate";
public String server = "localhost";  
public String username = "user"; 
public String password = "rezapassword" ;
public int port = 1400;




@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Log.i(LOGTAG,"oncreate called");
this.start();
}


AccountCreator(String server, int port, String username,String password) {
        this.server = "localhost";
        this.port = 1400;
        this.username = username;
        Log.i(LOGTAG,"first accountcreator called");
}

  public boolean start() {

      // try to connect to the server
//this method returns a value of true or false when called 

      try {
        socket = new Socket(server, port);
    }
        // if it failed not much I can so
    catch(Exception ec) {
//            display("Error connectiong to server:" + ec);
        Log.i(LOGTAG,"Error connectiong to server:" + ec);
        return false;
   }
    String msg = "Connection accepted " + socket.getInetAddress() + ":" + 
socket.getPort();
//        display(msg);
    Log.i(LOGTAG, msg);
    /* Creating both Data Stream */
    try
    {
        sInput  = new ObjectInputStream(socket.getInputStream());
        sOutput = new ObjectOutputStream(socket.getOutputStream());
    }
    catch (IOException eIO) {
 //         display("Exception creating new Input/output Streams: " + eIO);
        Log.i(LOGTAG,"Exception creating new Input/output Streams: " + 
 eIO);
        return false;
    }

    // creates the Thread to listen from the server 

    // Send our username to the server this is the only message that we
    // will send as a String. All other messages will be ChatMessage objects
    try
    {
        sOutput.writeObject(username);
        sOutput.writeObject(password);

    }
    catch (IOException eIO) {
//          display("Exception doing login : " + eIO);
        Log.i(LOGTAG,"Exception doing login : " + eIO);
        disconnect();
        return false;
    }
    // success we inform the caller that it worked
    return true;
}

 //            private void display(String msg) {
 //             TextView screenprint = (TextView)findViewById(R.id.systemmessages);

 //             screenprint.setText(msg);


//    }

        private void disconnect() {
            Log.i(LOGTAG,"reached disconnect");
            try { 
                if(sInput != null) sInput.close();
            }
            catch(Exception e) {} // not much else I can do
            try {
                if(sOutput != null) sOutput.close();
            }
            catch(Exception e) {} // not much else I can do
            try{
                if(socket != null) socket.close();
            }
            catch(Exception e) {} // not much else I can do
        }

  public void Begin() {             
      Log.i(LOGTAG,"it begun"); 
      int portNumber = 1400;
      String serverAddress = server;
      String userName = username;
      String newpassword = password;
 AccountCreator accountcreator = new AccountCreator(serverAddress, portNumber, 
 userName,password);

            if(!accountcreator.start())
            return;


  }
 }    

i was trying to put whole code in Async, i dont know if was i right, do i need to do that also or just some parts of it?

有帮助吗?

解决方案

In brief, AsyncTask contains a few methods which may be helpful:

onPreExecute:

  • This method is the first block of code executed when calling asyncTask.execute(); (runs on mainUIThread).

doInBackground:

  • Here you put all the code which may suspend you main UI (causes hang for your application) like internet requests, or any processing which may take a lot of memory and processing. (runs on background thread), contains one parameter taken from the asyncTask.execute(ParameterType parameter);

onPostExecute

  • Runs after doInBackground(). Its parameter is the return value of the doInBackground function, and mainly you put the changes in UI need to be done after the connection is finished (runs on mainUIThread)

其他提示

You have to declare another class within the class you have already created.

class SomeName extends Async<Void, String, Void>{ 

    protected void OnPreExecute(){
        // starts the task runs on main UI thread
        // Can be used to start a progress dialog to show the user progress
    }

    @Override
    protected Void doInBackground(Void... params){
        // does what you want it to do in the background
        // Connected to the server to check a log-in
        return result;
    }

    protected void OnPostExecute(Void result){
        // finishes the task and can provide information back on the main UI thread
        // this would be were you would dismiss the progress dialog
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top