Using AsyncTask for android network connection

19,291

Solution 1

Just one quick example of how it migtht look like:

public class IPControl extends Activity {
    private ProgressDialog pd = null;
    private String data = null;
    private Socket socket;
    private String serverIpAddress;
    private static final int REDIRECTED_SERVERPORT = 32;
    public PrintWriter out;
    public BufferedReader in ;

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

        setContentView(R.layout.main);

        try{   
            this.pd = ProgressDialog.show(this, "Loading..", "Please Wait...", true, false);
            new AsyncAction().execute();

        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    private class AsyncAction extends AsyncTask<String, Void, String> {
        protected Void doInBackground(String... args) { 
            try {
                InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                while (! in.ready());
                readBuffer();
                out.println("root\r\n");
                //System.out.print("root\r\n");
                while (! in .ready());
                readBuffer();
                out.println("root\r\n");
                //System.out.print("root\r\n");
                while (! in .ready());
                String msg = "";

                while (in.ready()) {
                    msg = msg + (char) in .read();
                }
            } catch (IOException e) {}

        return null;//returns what you want to pass to the onPostExecute()
    }

    protected void onPostExecute(String result) {
        //resultis the data returned from doInbackground
        IPControl.this.data = result;

        if (IPControl.this.pd != null) {
            IPControl.this.pd.dismiss();
        }
    } 
}

Solution 2

Go through this simple tutorial to get a good grounding on what an AsyncTask is and how to use it:

https://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/

Then try modifying your code to use async tasks. If you get problems, Just come back here :-)

Share:
19,291

Related videos on Youtube

Chris James Hancocks
Author by

Chris James Hancocks

Updated on September 16, 2022

Comments

  • Chris James Hancocks
    Chris James Hancocks over 1 year

    I am having some trouble using AsyncTask as I have never come across it before and have no clue what I am doing with it.

    Basically I am getting a force close because I am trying to run the connection on a main class. Could someone possibly help me with adding AsyncTask into the code:

    package com.smarte.smartipcontrol;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class IPControl extends Activity {
    
      private Socket socket;
      private String serverIpAddress;
      private static final int REDIRECTED_SERVERPORT = 32;
      public PrintWriter out;
      public BufferedReader in ;
    
        @Override
          public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // Get the message from the intent
            Intent intent = getIntent();
            serverIpAddress = intent.getStringExtra(IPEntry.ACTUALSMARTIP);
            createConnection();
    
          }
    
      public void getModel(View view) {
        try {
          out.println("[m\r\n");
          //System.out.print("root\r\n");
          while (! in .ready());
          String textStatus = readBuffer();
    
        } catch (IOException e) {}
      }
    
      public void createConnection() {
        try {
          InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
          socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
        } catch (UnknownHostException e1) {
          e1.printStackTrace();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
        try {
          out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          while (! in .ready());
          readBuffer();
          out.println("root\r\n");
          //System.out.print("root\r\n");
          while (! in .ready());
          readBuffer();
          out.println("root\r\n");
          //System.out.print("root\r\n");
          while (! in .ready());
          readBuffer();
        } catch (IOException e) {}
    
    
        //R.id.textStatus
      }
    
      private String readBuffer() throws IOException {
        String msg = "";
    
        while ( in .ready()) {
          msg = msg + (char) in .read();
        }
        //System.out.print(msg);
        if (msg.indexOf("SNX_COM> ") != -1) return msg.substring(0, msg.indexOf("SNX_COM> "));
        else return msg;
      }
    
    }
    
  • Chris James Hancocks
    Chris James Hancocks over 11 years
    Thanks Anup, I will give it my best shot :)