Android - 来自线程的活动的调用方法

时间:2011-07-15 15:09:25

标签: android

我有以下代码段:

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 * /),但这很简单。)

1 个答案:

答案 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. 
    }


     }
}