Подключение к сокету блокирует пользовательский интерфейс - PullRequest
5 голосов
/ 29 июля 2011

Я строю (ну, пытаюсь собрать) простую программу чтения новостей из usenet Код ниже работает. Is получает имя пользователя, хост, пароль из SharedPreferences и подключается к серверу и успешно аутентифицируется, однако блокирует пользовательский интерфейс, пока все задачи не будут выполнены.

Как бы я изменил этот код, чтобы он не блокировал интерфейс?

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 );

}


}

Ответы [ 3 ]

5 голосов
/ 29 июля 2011

Выезд AsyncTask

2 голосов
/ 29 июля 2011

Я уверен, что некоторые эксперты по Android укажут вам направление на различные фреймворки, которые вы хотите использовать для реализации этого, но основная проблема заключается в следующем.

Пользовательский интерфейс является однопоточным, этот поток часто называют потоком отправки событий. Поэтому, когда пользователь нажимает кнопку, и вы делаете что-то, что занимает много времени, пользовательский интерфейс не может делать что-то еще одновременно.

Вам нужно выполнить любую долгосрочную задачу в другом потоке и убедиться, что связь между потоком EDT и вашим рабочим потоком безопасна для потока.

0 голосов
/ 29 июля 2011
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
    ///////////////////////////////
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...