2011-07-29 4 views
5

ben inşa ediyorum (iyi, inşa etmeye çalışıyoruz) basit usenet haber okuyucusunu kilitleniyor. Aşağıdaki kod çalışır. SharedPreferences gelen kıskaçlar adınızı, ev sahibi, şifre mi ve sunucuya bağlanır ve başarıyla, doğrular tüm görevler yapılır dek ancak UI kilitleniyor.Bağlan UI

o UI kilitlemek kalmaması Nasıl bu kodu değiştirecek?

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

} 


} 

cevap

5

sen isteyeceksiniz dışarı AsyncTask

+0

i AsyncTask bir alt sınıfını oluşturmak bir AsyncTask (yanı sıra kullanıcı adı, şifre konak Strings ve her şey?) – dotty

+0

benim nntpClient nesnesi uzatabilir ve evet, ona argümanları geçebilir veya argümanları alan bir kurucu oluşturun. – Kaj

+0

Eğer bu değişkenleri lütfen geçirmeden bir örnek verebilir misiniz? – dotty

2

Ben Android uzmanlarından bazılarının çeşitli çerçeveler yönde bir işaret olacaktır eminim Kontrol Bunu uygulamak için kullanmak ancak aşağıdaki gibi temel bir sorundur.

Kullanıcı Arayüzü o iplik genellikle Olay Sevk Konuya olarak adlandırılır, dişli bekar. Bir kullanıcı bir düğmeye tıkladığında ve uzun zaman alır bir şey yapmak ne zaman, aynı anda başka bir şey yapmaktan UI durur.

Yapmanız gereken şey, farklı bir iş parçacığında uzun süren herhangi bir görev yapmak ve EDT iş parçacığı ile çalışan iş parçacığı arasındaki ileti iş parçacığı için güvenli olduğundan emin olmaktır.

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 evet (: Teşekkürler) kullanmak daha iyidir –