首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步任务,BufferedReader

异步任务,BufferedReader
EN

Stack Overflow用户
提问于 2012-04-16 20:36:32
回答 3查看 3.5K关注 0票数 0

我有一个BufferedReader,当我试着读它时,它只是挂起,什么也不做,我做的对吗?我正在AsyncTask中使用这个。

  • Edit:我有一个连接Wi的平板电脑,它连接到我的电脑,它在5334端口上播放172.20.104.203,我可以看到线程什么时候启动,但在那之后什么也看不见。

这里我的代码:

尝试{ final BufferedReader in =新BufferedReader(新的InputStreamReader(socket.getInputStream();字符串行=空;while ((line = in.readLine()) != null) { final String msg;msg = ( line );Log.d("DeviceActivity",msg);} catch (异常e) { e.printStackTrace();Log.e("ClientAcivtity: Exception",String.valueOf(e));}

  • EDIT --我拥有所有正确的权限或任何东西,我在AsyncTask之外做了这件事,它工作得很好,移动它是因为我不希望它出现在主线程中。

-编辑,这是完整的代码。

代码语言:javascript
复制
public class NetworkTask extends AsyncTask<Void, byte[], Boolean> {
        Socket nsocket; // Network Socket
        InputStream nis; // Network Input Stream
        OutputStream nos; // Network Output Stream
        private Handler handler = new Handler();

        Boolean connected = false;

        public static final int PORT = 5334;
        public String SERVERIP = "172.20.104.203";

        Socket socket;

        @Override
        protected void onPreExecute() {
            Log.i("AsyncTask", "onPreExecute");
            InetAddress serverAddr;
            try {
                serverAddr = InetAddress.getByName(SERVERIP);
                socket = new Socket(serverAddr, PORT);
                connected = true;
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.e("ClientAcivtity: Exception", String.valueOf(e));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.e("ClientAcivtity: Exception", String.valueOf(e));
            }
        }

        @Override
        protected Boolean doInBackground(Void... params) { // This runs on a
                                                            // different thread
            boolean result = false;

            try {

                Log.d("ClientActivity", "C: Connecting...");
                if (socket != null) {
                    int cont = 1;
                    while (cont == 1) {
                        try {
                            Log.d("ClientActivity", "C: Sending command.");
                            PrintWriter out = new PrintWriter(
                                    new BufferedWriter(new OutputStreamWriter(
                                            socket.getOutputStream())), true);
                            // where you issue the commands
                            out.println("getPos");
                            Log.d("ClientActivity", "C: Sent " + "getPos");

                        } catch (Exception e) {
                            Log.e("ClientAcivtity: Exception",
                                    String.valueOf(e));
                        }
                        try {
                            final BufferedReader in = new BufferedReader(
                                    new InputStreamReader(
                                            socket.getInputStream()));
                            String line = null;
                            while ((line = in.readLine()) != null) {
                                final String msg;
                                msg = (line);
                                Log.d("DeviceActivity", msg);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                            Log.e("ClientAcivtity: Exception",
                                    String.valueOf(e));
                        }
                        cont--;
                    }

                    Log.d("ClientActivity", "C: Closed.");
                }
            } catch (Exception e) {
                Log.e("ClientAcivtity: Exception", String.valueOf(e));
            }

            return result;
        }

        @Override
        protected void onProgressUpdate(byte[]... values) {
            if (values.length > 0) {
                Log.i("AsyncTask", "onProgressUpdate: " + values[0].length
                        + " bytes received.");
            }
        }

        @Override
        protected void onCancelled() {
            Log.i("AsyncTask", "Cancelled.");
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if (socket != null) {
                if (connected) {
                    if (result) {
                        Log.i("AsyncTask",
                                "onPostExecute: Completed with an Error.");
                        try {
                            socket.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    } else {
                        Log.i("AsyncTask", "onPostExecute: Completed.");
                        try {
                            socket.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-16 21:36:53

我的猜测是,当您写出命令"getPos“时,底层BufferedWriter实际上并没有在行上发送数据(您应该用tcpdump/wireshark验证这一点)。如果是这样的话,服务器就不会响应readLine(),因为它从来没有得到一个命令。若要验证此声明,请在out.flush();后添加out.println("getPos");

真的,tcpdump可能会给你一个比论坛上任何人更好的答案。

还请参见http://developer.android.com/reference/java/io/BufferedWriter.html

票数 0
EN

Stack Overflow用户

发布于 2012-04-16 20:52:45

试着这样做:

代码语言:javascript
复制
final BufferedReader in = new BufferedReader(new InputStreamReader(
                                                    socket.getInputStream()));
StringBuffer buf = new StringBuffer();
int i;
while((i = in.read()) != -1){
    buf.append((char) i);
}

String data = buf.toString();
票数 0
EN

Stack Overflow用户

发布于 2012-04-16 20:57:09

从套接字读取是一个相当困难的问题,这取决于套接字实际连接到哪里以及对方如何响应。

如果另一边速度非常快,它可以为套接字提供足够的数据,这样读取的例程才能正常工作。但是,如果另一边有任何延迟(只需要比读取例程慢一些,包括小的默认超时),那么即使另一边可能有数据,但读取失败--只是到达套接字的速度太慢了。

根据您的需要,您可以在读取例程周围包装您自己的最小和最大定时器。

请提供更多的信息,我们可以更好地理解这个问题。

在许多情况下,需要有足够大的最小超时时间,以便另一方将数据推送到套接字上--但您可能还需要最大的时间来等待数据到达。

更新:

首先,运行程序启动监视线程。如果需要,可以在循环中使用monitoringCanRun中断线程。并且可以使用monitoringThreadIsAlive来判断线程是否仍在运行。

代码语言:javascript
复制
    monitoringCanRun = true;
    new Thread(new Runnable() {
    public void run() {
        monitoringThreadIsAlive = true;
        performMonitoring();
        monitoringThreadIsAlive = false;
    }
    }).start();
}

performMonitoring看起来像:

代码语言:javascript
复制
   public void performMonitoring() {
while (monitoringCanRun) {
   ... do your read in the while loop
    ...you might like to insert some delay before trying again...
    try { //we delay every partial read so we are not too fast for the other side
    Thread.sleep(100);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
}

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10181320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档