2011-07-29 3 views
5

Я строю (ну, пытаясь построить) простой читатель новостей Usenet. Ниже приведен код. Захватывает имя пользователя, хост, пароль из SharedPreferences и подключается к серверу и успешно проходит проверку подлинности, однако блокирует пользовательский интерфейс до тех пор, пока все задачи не будут выполнены.Подключиться к гнезду блокировки UI

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

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

Заканчивать AsyncTask

+0

Могу ли я передать свой объект nntpClient к AsyncTask (а также имя пользователя, пароль, хост Струны и все остальное?) – dotty

+0

Вы создаете подкласс AsyncTask, и да, вы можете передать аргументы к нему, или создайте конструктор, который принимает аргументы. – Kaj

+0

Можете ли вы привести пример прохождения этих переменных, пожалуйста? – dotty

2

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

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

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

0
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

Лучше использовать AsyncTask – Kaj

+0

@Kaj yes (: Thanks –

Смежные вопросы