1

私はアンドロイドアプリケーションのバックグラウンドでネットワークを処理するためにASyncTaskを使用しようとしています。 SendDataで起こっていることは、別のスレッドにあります。バックグラウンドスレッドが実行され、最初の2つのログメッセージが出力されます。その後、それはハングアップします。私は両方のアンドロイドとソケットにはかなり新しいので、これは多くのエラーがある場合は驚かないだろう。私のアンドロイドアプリケーションは、破損していると思われるASyncTaskに基づくクライアントソケットを持っています

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"); 
     } 
    } 





} 
} 

答えて

1

はじめに、protected void onProgressUpdate(Integer...pos)はUIスレッドで実行されます。

これは通常ではありません。は、ネットワークに送信するのに最適な場所です。この方法を使用してUIを更新することが考えられます。 TextViewにカウンタまたは進捗ダイアログが含まれています。

第二に、#doInBackground(..)の実装は、スレッドプールの裏AsyncTaskからThreadを返し、ソケットとすぐに終了を設定します。

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

+0

うわー、ありがとう。私はAsyncTaskを理解しており、正しく使用しています。クライアントは遠隔測定をサーバに提供していますが、ローカルホスト上のエミュレータでのみ使用でき、無線LAN経由の物理デバイスでは使用できません。ああ、私は今よりずっと近くにいる。ありがとうございました – light24bulbs

+0

私はすべてのインターフェイスでリッスンするには、サーバーソケットを0.0.0.0にバインドする必要があることを知りました。素晴らしい!それは今働く。 – light24bulbs

関連する問題