【发布时间】:2016-03-27 08:57:44
【问题描述】:
我有以下问题。在主线程上,我有一个EditText 字段,我有一个AsyncTask,它无限地侦听套接字以获取传入消息。在循环中(位于doInBackground())我试图调用onProgressUpdate()并将其传递给一个字符串,我希望当oPU()接收到字符串时将其显示在位于主线程的EditText上.
public class ClientSide extends AsyncTask<String, String, String>{
public EditText field = (EditText) findViewById(R.id.bar1);
...}
第一个问题是findViewById(R.id.bar1) 上的它说无法解析符号。什么可能导致它,我该如何解决它。
第二个问题是循环。问题是我不想通过主线程定期创建新的AsyncTask 对象,因为在我的情况下,这意味着每次对象是 .execute()-ed 时都创建一个套接字并绑定到它。请建议我一种重新组织代码的方法,以便使解决方案更加优雅。我知道AsyncTasks 是针对不长应用程序的短流程,所以我知道我当前的解决方案(带有循环)是一个正在分解的胡萝卜(也就是坏的)。
再来一次:
1、如何让findViewById()真正匹配EditText的UI元素?
2. 当应用程序需要在后台执行其消息侦听器时,如何重新组织我的代码以便不创建套接字?
您也可以看到 Async.. doInBackground:
protected String doInBackground(String... params){
final String SERVER_HOSTNAME = "hereGoesMyIP";
final int SERVER_PORT = 2002;
BufferedReader mSocketReader;
PrintWriter mSocketWriter;
final String TAG = ClientSide.class.getSimpleName();
String outputln = "Me. Android";
try {
//Initialization of the socket, socket reader and writer.
Socket socket = new Socket(SERVER_HOSTNAME, SERVER_PORT);
mSocketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
mSocketWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("Connected to server " + SERVER_HOSTNAME + ":" + SERVER_PORT);
//An infinite loop which checks for incoming messages.
while(true){
String inMsg="";
String aMessage = "";
//Reads from the socket
if((inMsg=mSocketReader.readLine())!=null && socket.isConnected()){
publishProgress(inMsg);
}
Thread.sleep(500);//still requres try - catch?
}
} catch (IOException ioe) {
System.err.println("Cannot connect to " + SERVER_HOSTNAME + ":" + SERVER_PORT);
ioe.printStackTrace();
}
return null;
}
【问题讨论】:
标签: java android sockets loops android-asynctask