Socket connection blocks user interface

I am building (well, trying to build) a simple Usenet news reader. Below is the code. It captures the username, host, password from SharedPreferences and connects to the server and successfully passes authentication, but it blocks the user interface until all tasks are completed.

How can I change this code so that it does not block the user interface?

package com.webfoo.newz;

import java.io.IOException;
import java.net.SocketException;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import org.apache.commons.net.nntp.NNTPClient;

public class NewzActivity extends Activity {

TextView statusText;
String PREFS_NAME = "MyPrefsFile";
SharedPreferences settings;
NNTPClient nntpClient;
int port;
String username;
String password;
String host;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.statusText = (TextView)findViewById(R.id.connectionStatusTextView);
    this.nntpClient = new NNTPClient();
    this.settings = getSharedPreferences(PREFS_NAME, 0);
}

public void openSettings(View button){
    Intent settingsIntent = new Intent( NewzActivity.this, SettingsActivity.class );
    startActivity( settingsIntent );
}

public void makeConnection(View button) {

    this.statusText.setText("Connecting...");       
    this.port = settings.getInt("UsenetPort", 563);
    this.host = settings.getString("UsenetHost", "");
    this.nntpClient.setDefaultPort( port );
    this.nntpClient.setDefaultTimeout( 9999 );
    // this.nntpClient.setConnectTimeout( 9999 );
    this.statusText.setText("Connecting to " + host );

    try {
        this.nntpClient.connect( host );
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    this.statusText.setText("Connected to " + host );

    if( nntpClient.isConnected() ){
        setAuthDetails();
    }else{
        this.statusText.setText("Failed to Connected to " + host );
    }

}

private void setAuthDetails() {

    this.username = settings.getString("UsenetUsername", "");
    this.password = settings.getString("UsenetPassword", "");

    try {
        nntpClient.authinfoUser(username);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        nntpClient.authinfoPass(password);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    statusText.setText("Authenticated as " + username );

}


}
+5
source share
3 answers

Check out AsyncTask

+5
source

, Android , , .

, Thread Dispatch Thread. , , -, , - .

, EDT .

+2
Thread T = new Thread(new Runnable(){
    public void run(){
        ///////////////////////////////
        //YOUR CODE
        ///////////////////////////////
    }
});


        //IF YOU WANT TO MANIPULATE THE UI inside the run()
        //USE:
runOnUiThread(new Runnable() {
@Override
public void run() {
    ///////////////////////////////
    //Your Code
    ///////////////////////////////
    }
});
0
source

All Articles