2011-07-29 9 views
5

私は単純なusenetニュースリーダーを構築しています(ビルドしようとしています)。以下のコードは動作します。ユーザー名、ホスト、パスワードをSharedPreferencesから取得してサーバーに接続し、正常に認証しますが、すべてのタスクが完了するまでUIをロックします。ソケットに接続するとUIがロックされます

このコードを変更して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

私はAndroidの専門家のいくつかは、あなたがこれを実装するために使用したいと思う様々な枠組みの方向にあなたを指します確信しているが、次のように基本的な問題があるAsyncTask

+0

私はAsyncTaskに私のnntpClientオブジェクトを渡すことができます(同様に、ユーザー名、パスワード、ホスト文字列と他のすべて?) – dotty

+0

あなたはAsyncTaskのサブクラスを作成し、はい、あなたはそれに引数を渡すことができ、または引数を取るコンストラクタを作成します。 – Kaj

+0

これらの変数を渡す例を教えてもらえますか? – dotty

2

をチェックしてください。

ユーザーインターフェイスはシングルスレッドであり、そのスレッドはしばしばイベントディスパッチスレッドと呼ばれます。したがって、ユーザーがボタンをクリックして長時間かかることがあると、UIは同時に他の操作を停止します。

実行する必要があるのは、異なるスレッドで長時間実行されるタスクを実行し、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はい(:ありがとう –

関連する問題