不幸的是,AsyncTask在第二次执行时停止

时间:2014-02-27 08:44:07

标签: android android-asynctask arduino

我正试图用我的Android手机从我的Arduino中获取字符串,一切顺利,除非我第二次按下我的更新按钮,不幸的是停止了。

我似乎无法追踪问题而且我的选项用完了所以我现在正在向你们寻求帮助。

package com.TRY.udp2;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

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

public class MainActivity extends Activity {

private String rcvStr, serverIP="192.168.0.15";
private TextView textLog;//Log for outputs
private EditText textMsg;
Button updateButton;//(dis)connect Button
Boolean connected=false;//stores the connectionstatus
DataOutputStream dataOutputStream = null;//outputstream to send commands
Socket socket = null;


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

    Button updateButton = (Button) findViewById(R.id.updateButton);
    textMsg = (EditText) findViewById(R.id.textMsg);
    textLog = (TextView) findViewById(R.id.textLog);


    updateButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            String textlogMsg = textMsg.getText().toString();
            new synchTask().execute(textlogMsg);
        }
    });
}

private class synchTask extends AsyncTask<String, Void, String> {

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

            String msg=params[0].toString();
            InetAddress toAddress = null;
            try 
            {
                toAddress = InetAddress.getByName(serverIP);
            } 
            catch (UnknownHostException e) 
            {
                e.printStackTrace();
            }

            int port=5000;
            DatagramSocket dtSocket = null;

            try 
            {
                dtSocket = new DatagramSocket(port);
            } 
            catch (SocketException e1) 
            {
                e1.printStackTrace();
            }

            byte[] dataBytes = msg.getBytes();
            DatagramPacket sndPacket = new DatagramPacket(dataBytes, dataBytes.length, toAddress, port);
                try 
                {
                    dtSocket.send(sndPacket);
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }


                try
                {
                    byte[] rcvData = new byte[1024];
                    DatagramPacket rcvPacket = new DatagramPacket(rcvData, rcvData.length);
                    dtSocket.receive(rcvPacket);
                    rcvStr = new String(rcvPacket.getData());
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }

            return rcvStr;
        }

    protected void onPostExecute(String result) {
        textLog.setText(rcvStr);
    }

    }




@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

如果有更好的方法从arduino获取字符串,请帮忙。

1 个答案:

答案 0 :(得分:2)

您可能需要在dtSocket结束时关闭doInBackground()。否则,当您第二次执行时,您将尝试在绑定端口上创建套接字。