Tastybrownies
Tastybrownies

Reputation: 937

Issue about using Async with an Android Client

I am currently creating a project that needs to have a simple async task to take care of a thread running behind the scenes. The user needs to login. I am using another class called PVAndroid Client that supplies useful methods and has an XML serializer form packets for me. I am completely new to working with threads or doing anything with servers, so this may be completely wrong or somewhat right.

I get the data the user entered: the ip address and port, their username (I split this into first and last name), their region they selected. I encrypt their password, and attempt to connect to the tcp using ip address and port number. I am trying to work in the async task but am kind of confused on what I should do. Can anyone guide me in the right direction and help me out?

Thank you I really appreciate it.

    private TcpClient myTcpClient = null;
    private UdpClient udpClient;
    private static final String USERNAME_SHARED_PREFS = "username";
    private static final String PASSWORD_SHARED_PREFS = "password";
    private static final String IP_ADDRESS_SHARED_PREFS = "ipAddressPref";
    private static final String PORT_SHARED_PREFS = "portNumberPref";
    private String encryptedNameLoginActivity, encryptPassLoginActivity;
    private EditText userText, passText;
    private String getIpAddressSharedPrefs, getPortNumberPrefs;
    private String getUserNameValue;
    private String getPasswordValue;
    private String fName, lName;
    private SharedPreferences settings;
    private Editor myEditor;
    private boolean getCheckedRemember;
    private boolean resultCheck = false;
    private int portNum;
    private Button submitButton;
    private String userMACVARIABLE = "";
    private String regionSelected, gridSelected;
    private Spinner regSpinner, gridSpinner;
    PVDCAndroidClient client;
    private int userNum;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        client = new PVDCAndroidClient();
    }

    @Override
    protected void onStart() {
        super.onStart();

        // Take care of getting user's login information:
        submitButton = (Button) findViewById(R.id.submitButton);
        userText = (EditText) findViewById(R.id.nameTextBox);
        passText = (EditText) findViewById(R.id.passwordTextBox);
        regSpinner = (Spinner) findViewById(R.id.regionSpinner);

        // grid selected as well? sometime?
        regSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View v,
                    int position, long rowId) {
                regionSelected = regSpinner.getItemAtPosition(position)
                        .toString();

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub
            }
        });
        submitButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                settings = PreferenceManager
                        .getDefaultSharedPreferences(AndroidClientCompnt.this);

                getIpAddressSharedPrefs = settings.getString(
                        IP_ADDRESS_SHARED_PREFS, "");
                portNum = Integer.parseInt(settings.getString(
                        PORT_SHARED_PREFS, ""));

                if (getIpAddressSharedPrefs.length() != 0 && portNum != 0) {
                    if (userText.length() != 0 && passText.length() != 0) {
                        try {

                            try {
                                // encrypting the user's password.
                                encryptPassLoginActivity = Secure.encrypt(passText
                                        .toString());
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                            // first connect attempt.
                            myTcpClient = new TcpClient();
                            myTcpClient.connect(getIpAddressSharedPrefs,
                                    portNum);
                            // here is where I want to call Async to do login
                            // or do whatever else.

                            UploadTask task = new UploadTask();
                            task.execute();


                        } catch (Exception e) {
                            Toast.makeText(getApplicationContext(),
                                    "Could not connect.", Toast.LENGTH_LONG)
                                    .show();
                            e.printStackTrace();
                        }
                    }

                }
            }
        });
    }

    private class UploadTask extends AsyncTask<String, Integer, Void> 
    {
        @Override
        protected void onPreExecute() {
            Toast.makeText(getApplicationContext(), "Loading...",
                    Toast.LENGTH_LONG).show();
                            }

        @Override
        protected Void doInBackground(String... names) {

                    resultCheck = myTcpClient.connect(getIpAddressSharedPrefs,
                            portNum);


                    if (resultCheck == true) {
                        while (myTcpClient.getUserNum() < 0) {
                            // num set? session? with proxy server?
                        }

                        String[] firstAndLast;

                        String spcDelmt = " ";

                        firstAndLast = userText.toString().split(spcDelmt);

                        fName = firstAndLast[0];
                        lName = firstAndLast[1];

                        // set up the tcp client to sent the information to the
                        // server.
                        client.login(fName, lName, encryptPassLoginActivity,regionSelected, 128, 128, 20);

                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Connection not successful", Toast.LENGTH_LONG)
                                .show();
                    }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Toast.makeText(getApplicationContext(), "Connected",
                    Toast.LENGTH_LONG).show();
        }
    }

}

Upvotes: 0

Views: 147

Answers (2)

Rafael T
Rafael T

Reputation: 15689

I cannot see, where you are yoursing your Task, but I see that you are doing something weired inside doInBackground()! There is absolutely NO reason, to create your own Thread inside it. remove that, and you could just use your Task like this:

UploadTask task = new UploadTask();
task.execute("someString", "anotherString", "addAsManyStringsYouNeed");

The docs from AsyncTask are very helpfull, too.

Upvotes: 0

Simon Dorociak
Simon Dorociak

Reputation: 33515

First

@Override
protected Void doInBackground(String...params) {
    new Thread (new Runnable() {
       // ...
    }
}

Never do this again. There is no need to create new Thread in doInBackground method which actually running on background Thread. So remove it.

The advice to you is tricky because you need to read about Threads, work with Connection etc. So the best advice to you is to read some tutorials, examples of basic applications and read references. So you can start here:

Android TCP Client and Server Communication Programming–Illustrated with Example

Upvotes: 1

Related Questions