我正在尝试使用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);
}
}
}
答案 0 :(得分:2)
AsyncTasks将陆续执行。您正在启动多个异步任务,但如果第一个没有完成,则其他任务将永远不会运行。
让它们真正并行运行使用执行程序或使用线程。
您可以使用一个异步任务进行感应,并将线程用于开/关按钮。