Java 连接到套接字锁定用户界面
我正在构建(嗯,尝试构建)一个简单的usenet新闻阅读器。下面的代码可以工作。Is从SharedReferences获取用户名、主机和密码,并连接到服务器并成功进行身份验证,但它会锁定UI,直到所有任务完成 如何更改此代码,使其不会锁定UIJava 连接到套接字锁定用户界面,java,android,sockets,Java,Android,Sockets,我正在构建(嗯,尝试构建)一个简单的usenet新闻阅读器。下面的代码可以工作。Is从SharedReferences获取用户名、主机和密码,并连接到服务器并成功进行身份验证,但它会锁定UI,直到所有任务完成 如何更改此代码,使其不会锁定UI package com.webfoo.newz; import java.io.IOException; import java.net.SocketException; import android.app.Activity; import andr
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 );
}
}
查看一下我相信一些安卓专家会为您指出实现此功能所需的各种框架的方向,但基本问题如下 用户界面是单线程的,该线程通常被称为事件调度线程。因此,当用户单击一个按钮,而您做了一些需要很长时间的事情时,就会阻止UI同时做任何其他事情
您需要做的是在不同的线程中执行任何长时间运行的任务,并确保EDT线程和工作线程之间的通信是线程安全的。最好使用AsyncTask。我可以将nntpClient对象传递给AsyncTask吗(以及用户名、密码、主机字符串和其他所有内容?)您创建了AsyncTask的一个子类,是的,您可以向它传递参数,或者创建一个接受参数的构造函数。您能给出一个传递这些变量的示例吗?
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
///////////////////////////////
}
});