当asyntask onprogress更新运行时,不能再做其他任务

时间:2016-01-27 15:19:04

标签: android http android-asynctask httpurlconnection async-onprogressupdate

我正在尝试使用asynctask onprogress更新方法将传感器数据从arduino传输到Android手机。传感器的数据显示在TextView中,有2个按钮用于打开和关闭LED。

问题是Android手机正在从arduino获取实时数据,但我无法同时打开和关闭灯光。我试图阻止Android手机获取传感器的数据并尝试打开和关闭灯光。这很有效。获取传感器数据和打开/关闭LED都不能同时工作。有人可以帮我解决这个问题。这对我来说非常重要,因为它正在将它用于一个项目。

android代码:

package com.example.arduinoandroidasyntasktesting6;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    TextView data;
    Button On,Off;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Sensors().execute("");

        data=(TextView)findViewById(R.id.textView2);
        On=(Button)findViewById(R.id.buttonOn2);
        Off=(Button)findViewById(R.id.buttonOff2);

         On.setOnClickListener(new OnClickListener()  
            {  
                @Override  
                public void onClick(View v)  
                {  
                    new Sensors().execute("?led2=1");
                }  
            }); 

         Off.setOnClickListener(new OnClickListener()  
            {  
                @Override  
                public void onClick(View v)  
                {  
                    new Sensors().execute("?led2=0");
                }  
            }); 
    }

    class Sensors extends AsyncTask<String, byte[], String>{

        InputStream nis;
        OutputStream nos;
        BufferedReader in;
        DefaultHttpClient httpclient =new DefaultHttpClient();
        URL url;
        URLConnection urlconn=null;
        InputStreamReader isn;
        @Override


        protected String doInBackground(String... params) {

            try{
                while(true){
                url =new URL("http://192.168.1.177/"+params[0]);
                urlconn=(HttpURLConnection)url.openConnection();

                nis = urlconn.getInputStream();
                in= new BufferedReader(new InputStreamReader(nis));

                String msg = in.readLine();
                byte[] thebyte =msg.getBytes();
                publishProgress(thebyte);

                }
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }


            return null;
        }

         protected void onProgressUpdate(byte[]... values) {
                String command=new String(values[0]);//get the String from the recieved bytes
                data.setText(command);
            }
    }
}

1 个答案:

答案 0 :(得分:2)

AsyncTasks将陆续执行。您正在启动多个异步任务,但如果第一个没有完成,则其他任务将永远不会运行。

让它们真正并行运行使用执行程序或使用线程。

您可以使用一个异步任务进行感应,并将线程用于开/关按钮。