Android蓝牙套接字连接使用AsyncTask

时间:2015-05-21 16:00:41

标签: java android sockets android-asynctask bluetooth

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

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();

类Receptor我读过这样的东西:

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是如何工作的所以我需要帮助,对不起我的英语和谢谢。

2 个答案:

答案 0 :(得分:0)

如果你想使用asynctask并希望在收到任何数据时更新listview,那么你可以在asynchtask中使用publishProgress方法,我知道你已经在使用它了。

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

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

答案 1 :(得分:0)

我建议不要为此使用异步任务。它们是短期任务的首选。因为你需要套接字来连续监听数据。

实施后台服务https://developer.android.com/training/run-background-service/create-service.html并使用接收器https://developer.android.com/reference/android/os/ResultReceiver.html将数据提供给您的活动。