我有以下代码段:
public class SocketActivity extends Activity {
.
.
.
EditText textView;
Socket socket = new Socket(name,ip);
out = new PrintWriter(socket.getOutputStream());
out.flush();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
.
.
.
}
现在,我有其他行允许此活动与java服务器通信。但我想做的是创建一个不断监听来自服务器的消息的线程。目前,它仅在我发送消息后侦听响应。如何从线程中设置textView?这是最好的方法吗?如果没有,我还应该在哪里做到这一点?
======================
所以,这里有一个更完整的描述我想做什么,textView太原始了我想要的东西。所以我有一个 MainActivity 创建一个超级 SurfaceView ,它有一个超级渲染器,其中包含一个带有缓冲区的 Cube 对象,所以它可以绘制。我还有一个 SocketActivity 来连接服务器
我想要做的是等待服务器向客户端发送一个包数据包。然后,当接收到每个点时,将其放入缓冲器中。然后,一旦完成,它再次等待下一个数据包。我应该如何使用Asynctask每次收到一个指向缓冲区的点。因此,要获得正在发生的事情的地图:
public class MainActivity extends Activity {
OpenGLSurfaceView view;
.
.
.
}
public class OpenGLSurfaceView extends SurfaceView {
OpenGLRenderer renderer;
.
.
.
}
public class OpenGLRenderer extends Renderer {
Cube cube;
.
.
.
}
public class Cube{
private FloatBuffer vertexBuffer;
.
.
.
}
public class SocketActivity extends Activity {
Socket socket;
BufferedReader in;
PrintWriter out;
.
.
.
}
现在应该在哪里实例化Asynctask?我应该以这种方式构建我的程序,还是有更好的方法? (对于那些不知道的人来说,将一个原语放入缓冲区你使用 buffer.put(/ * primitive * /),但这很简单。)
答案 0 :(得分:0)
您无法从非UI线程修改UI(在本例中为TextView)。尝试使用AsyncTask。只能在onPreExecute()和onPostExecute()方法中修改UI。如果您需要如何使用AsyncTask的示例,请索取。
还有另一种方法可以使用方法runOnUiThread()来使用Runnable,但我推荐使用AsyncTask。
示例:
private class Surgery extends AsyncTask<String, Void, String> {
private String dataSurgery=null;
private File fileSurgery=null;
public Surgery (String data1, File data) //constructor
{
this.dataSurgery = data1; //this is just example here you can put anything you want
this.fileSurgery = data;
}
@Override
protected String doInBackground(String... params) {
//OPERATION WHICH IS UI-INDEPENDENT LET'S SAY SOMETHING LIKE THIS:
Socket socket = new Socket(name,ip);
out = new PrintWriter(socket.getOutputStream());
out.flush();
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); return "here you return data for the textview or anything you need";
}
@Override
protected void onPostExecute(String result) {
// HERE YOU UPDATE YOUR TEXTVIEW i.e HERE YOU UPDATE ANYTHING WHICH IS ON THE UI
}
@Override
protected void onPreExecute() {
// This is OPTIONAL, you might find you dont need to use it.
}
}
}