【问题标题】:Android Send and Receive Data simultaneously [duplicate]Android同时发送和接收数据[重复]
【发布时间】:2017-05-25 04:54:51
【问题描述】:

我正在尝试从服务器接收我的安卓手机上的数据。我不明白为什么它总是崩溃...请帮助!

seekbarbrightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekbarbrightness, int progress, boolean b) {
            if(b==true) {
                seekbarvalue = seekbarbrightness.getProgress();
                multiplier = (double) seekbarvalue / 100;
                finallumens = (int) (multiplier * LoginActivity.enterlumens);
                tblumens.setText(String.valueOf(finallumens) + " Lumens");
                if (LoginActivity.getSocket() != null) {
                    try {



                        InputStreamReader streamReader = new InputStreamReader(LoginActivity.getSocket().getInputStream());
                        BufferedReader reader = new BufferedReader(streamReader);
                        String str = reader.readLine();
                        tbvolts.setText("Voltage: "+str);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                else{
                    Toast.makeText(MainActivity.this, "NOT connected To Socket, please disconnect and reconnect!", Toast.LENGTH_SHORT).show();
                }
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

如果我删除接收数据代码,并将以下代码放在 try 和 catch 块中,它可以工作。

LoginActivity.getSocket().getOutputStream().write(String.valueOf(multiplier).getBytes());

我不确定我做错了什么。但下面是我在 logcat 中遇到的错误,我的应用程序崩溃了。

Exception in MessageQueue callback: handleReceiveCallback.
android.os.NetworkOnMainThreadException

这是我创建的异步方法。这是正确的吗?以及如何在我的 AsyncTask 中提取 str 值并将其放入 Textview 的任何想法?我只能打印出值,但不能用它设置文本。

class ReceiveData extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... args) {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(LoginActivity.getSocket().getInputStream()));
            in.readLine();
            String str = in.readLine();
            return str;

        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        }

    }

【问题讨论】:

  • @DiegoTorresMilano 我不明白。当我将代码切换为发送字节时,它可以工作。但只有在接收数据时才不会..
  • 你不应该在主线程上做任何网络操作

标签: android sockets


【解决方案1】:

长时间运行的任务会给主线程带来更多负载,这就是为什么 NetworkOnMainThreadException 显示,主线程总是用于执行小任务,如更新 UI 等。要执行长时间运行的任务,请使用 AsyncTask。

https://stackoverflow.com/a/6343299/4741746

此链接向您展示如何使用 AsyncTask。在安卓中

完成任务后,如果你想更新 UI,可以使用 AsyncTask 的 onPostExecute 方法

也看看这篇文章对你有帮助-https://stackoverflow.com/a/12650928/4741746

【讨论】:

  • 我尝试的另一种方法是将网络操作放到另一个线程中,并在主线程中调用thread.start()。它是这样工作的,但是有什么做法吗?
  • 有多种方式,如 Handler 、 Thread 等,但最好是 AsyncTask
  • 使用最多的库,如改造、凌空、loopj 异步库等,其中改造是最好的
  • 但建议您从异步任务开始,而不是继续进行最佳实践
  • 啊,我明白了。看来我的线程只能运行两次,而且它会崩溃。请问AsyncTask,在我的情况下,我只需要将输入流代码放入onPostExecute?我的套接字创建是在另一个活动中创建的。
猜你喜欢
  • 2012-05-09
  • 2017-06-25
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多