2015-05-21 74 views
1

我是Android的noob,我正在制作一个应用程序,通过蓝牙连接手机与Arduino,当用户按下某些按钮时手机发送数据,但问题是手机必须期望在不停止应用程序的情况下连续接收数据,而手机收到数据时必须更新一个listview和两个textview,并且不断等待另一次接收数据。我已经读过,我必须使用一个扩展了AsyncTask的类,但是在阅读了很多东西之后,我仍然不明白它是如何工作的。在主类的onCreate方法执行线程,会有些这样的:Android的蓝牙套接字连接在后台使用AsyncTask接收数据

ListView listView = (ListView)findViewById(R.id.ListaAlertas); 
TextView textTemp = (TextView)findViewById(R.id.NumeroTemperatura); 
TextView textHum = (TextView)findViewById(R.id.NumeroHumedad); 
Receptor task = new Receptor(listView, textTemp,textHum); 
task.execute(); 

和类受体我看过这样的事情:

public class Receptor extends AsyncTask<Void, Integer, Void> { 

    private WeakReference<ListView> list; 
    private WeakReference<TextView> temp; 
    private WeakReference<TextView> hum; 
    BluetoothSocket socketReceptor; 
    InputStream inpReceptor; 
    OutputStream outReceptor; 

    public Receptor(ListView view, TextView view2, TextView view3) { 
     this.list = new WeakReference<ListView>(view); 
     this.temp = new WeakReference<TextView>(view2); 
     this.hum = new WeakReference<TextView>(view3); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      socketReceptor = SocketSingleton.getSocket(); 
      inpReceptor = socketReceptor.getInputStream(); 
      outReceptor = socketReceptor.getOutputStream(); 

      byte[] buffer = new byte[25]; 
      int read = inpReceptor.read(buffer); 
      while(read != -1){ 
       publishProgress(read); 
       read = inpReceptor.read(buffer); 
      } 

      inpReceptor.close(); 
      outReceptor.close(); 
      socketReceptor.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

我在SocketSingleton类插座现在我只想等待阅读,直到我有东西要接收,然后更新listView和属于主类的两个textView,然后再返回,等待阅读,直到我有新的东西接收。我不明白AsyncTask是如何工作的,所以我需要帮助,对于我的英语感谢,并感谢。

回答

0

如果你想使用asynctask并且想在接收到任何数据时更新列表视图,那么你可以在asynchtask中使用publishProgress方法,我看到你已经在使用它。

您可能只需要添加此函数来接收进度,并在该函数中您可以更新列表视图。

protected void onProgressUpdate(Integer... progress) { 
    //Update the progress on listview 
}