Android同时发送和接收数据

时间:2017-05-25 04:54:52

标签: android sockets

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

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";
        }

    }

1 个答案:

答案 0 :(得分:0)

长时间运行的任务会给主线程带来更多负载,这就是var delay; document.addEventListener("mousemove", function () { callSetTimeout(); }); function callSetTimeout () { if (!isNaN(delay)) { clearTimeout(delay); } delay = setTimeout(function () { console.log("do something"); }, 5000); } 显示的原因,主线程始终用于执行更新UI等小任务。要执行长时间运行的任务,请使用AsyncTask。

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

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

并且在完成任务后如果要更新UI,则可以使用AsyncTask的NetworkOnMainThreadException方法

另请看这篇帖子,它可以帮助您 - https://stackoverflow.com/a/12650928/4741746