1

ASyncTaskを使用して、Androidアプリケーションのバックグラウンドでネットワークを処理しようとしています。SendDataで発生することはすべて、別のスレッドにあります。バックグラウンドスレッドが実行を開始し、最初の2つのログメッセージを出力します。その後、ハングします。私はAndroidとソケットの両方にまったく慣れていないので、これに多くのエラーがあったとしても驚かないでしょう。

package light24bulbs.ioio.testing;

import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.util.BaseIOIOLooper;
import ioio.lib.util.IOIOLooper;
import ioio.lib.util.android.IOIOActivity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.Button;
import android.widget.Toast;
import ioio.lib.api.PwmOutput;
import android.view.*;
import android.widget.TextView;
import android.util.Log;
import light24bulbs.ioio.testing.R;
import java.io.*;
import java.net.*;
import android.os.AsyncTask;
import android.view.View.*;

public class MainActivity extends IOIOActivity {
    private SeekBar bar_;
    private final int servoPin = 11;
    private final int freq = 100;
    private final String serverIP="192.168.1.41";
    TextView progressText;
    Button open;
    int progress;
    SendData senddata;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bar_ = (SeekBar) findViewById(R.id.seekBar1);
        TextView progressText = (TextView) findViewById(R.id.textView1);
        open = (Button) findViewById(R.id.start);
        open.setOnClickListener(openSocket);
        senddata = new SendData();
        senddata.execute(serverIP,null,null);


    }


    class Looper extends BaseIOIOLooper {
        /** The on-board LED. */
        private PwmOutput servo_;

        //happens when IOIO module is connected
        @Override
        protected void setup() throws ConnectionLostException {

            servo_ = ioio_.openPwmOutput(servoPin, freq);



        }

//loops forever once everything else has been set up
        @Override
        public void loop() throws ConnectionLostException {

            servo_.setPulseWidth(600+(bar_.getProgress()*20));
            //servo_.setPulseWidth(800);
             progress = bar_.getProgress();
             senddata.onProgressUpdate(progress);

             try{
                 Thread.sleep(20);
             }catch(InterruptedException e){

             }
        }
    }

    @Override
    protected IOIOLooper createIOIOLooper() {
        return new Looper();
    }


private class SendData extends AsyncTask<String, Integer, Boolean>{
    Socket clientSocket;
    DataOutputStream toServer;
    PrintStream pStream;
    @Override
    protected Boolean doInBackground(String... IP){
        Log.i("AsyncTask","doInBackground started running");
        Log.i("AsyncTask","attempting to connect to ip: "+IP[0]);
        try{


        clientSocket = new Socket(IP[0],4488);
        Log.i("AsyncTask","Created socket"+String.valueOf(clientSocket));
        toServer = new DataOutputStream(clientSocket.getOutputStream());
        }catch(IOException e){
            Log.i("AsyncTask","IO Exception while connecting socket- doInbackground()");
            return false;
        }
        Log.i("AsyncTask","Port connected! "+IP[0]);
        return true;
    }
    @Override
    protected void onProgressUpdate(Integer...pos){
        try{
        toServer.writeBytes(String.valueOf(pos[0]));
        }catch(IOException e){
            Log.i("AsyncTask","Failed to send the position");
        }
    }





}
}
4

1 に答える 1

1

手始めprotected void onProgressUpdate(Integer...pos)に、UIスレッドで実行します。

これは通常、ネットワークにデータを送信するのに最適な場所ではありません。この方法を使用してUIを更新することをお勧めします。たとえば、TextViewカウンターや進行状況ダイアログを含む更新などです。

次に、の実装は#doInBackground(..)ソケットをセットアップしてすぐに終了Threadし、スレッドプールバッキングに戻りますAsyncTask

サーバーに複数のパッケージを送信する場合は、ここでループを作成する必要があります。また、-への呼び出しtoServer(およびループの実行)もdoInBackground()-で実行する必要があります。UIを更新する場合は-#publishProgress(..) から #doInBackground()呼び出します。これにより、視覚化するデータがに渡され#onProgressUpdate(..)ます。

于 2012-05-14T09:12:39.470 に答える