1

イーサネット経由でアナログ信号を Android アプリに送信しています。目標は、描画されるいくつかの形状のアルファ チャネルを制御することです。コードは特に四角形に適用されます。両方のチュートリアルが別々に機能するようになりました。通信は信号を受信し、値を画面に出力します。グラフィック 1 は四角形を描画し、タッチ イベントに基づいて画面上で移動します。

それはNullExceptionErrorオンラインになりsocket = serverSocket.accept()ます。これは個別には発生しません。

どの部分がグラフィック チュートリアルの一部で、どの部分がコミュニケーション チュートリアルであるかを示しました。onCreate のようないくつかの部分が組み合わされています。

ありがとう

public class MainActivity extends Activity implements OnTouchListener {

DrawView v;
float x;
float y;
Bitmap pic;
int alpha;

private ServerSocket serverSocket;   
Handler updateConversationHandler; 
Thread serverThread = null;    
public static final int SERVERPORT = 6000;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    init();
    v.setOnTouchListener(this);
    setContentView(v);

    updateConversationHandler = new Handler();

    this.serverThread = new Thread(new ServerThread());
    this.serverThread.start();
}

@Override
protected void onStop() {
    super.onStop();
    try {
        serverSocket.close();
        finish();
        System.exit(0);
    } catch (IOException e) {
        e.printStackTrace();
    }
}


//communications tutorial

class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted() && socket==null) {

            try {
                socket = serverSocket.accept();         //null exception here
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class CommunicationThread implements Runnable {

    private Socket clientSocket;

    private BufferedReader input;


    public CommunicationThread(Socket clientSocket) {

        this.clientSocket = clientSocket;

        try {

            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() {

        while (!Thread.currentThread().isInterrupted()) {

            try {

                String read = input.readLine();
                int value = Integer.parseInt(read);
                alpha=value*(255/1023);
                //updateConversationHandler.post(new updateUIThread(read));

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
//end communications tutorial

//graphics tutorial

private void init(){

    v = new DrawView(this);

    //pic = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

    x = 0;
    y = 0;
    alpha=255;

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    v.pause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    v.resume();
}

public class DrawView extends SurfaceView implements Runnable{

    Thread t = null;
    SurfaceHolder holder;
    boolean running = false;

    public DrawView(Context c){
        super(c);
        holder = getHolder();
    }

public void run() {

    while(running){
        if(holder.getSurface().isValid()){
        Canvas c = holder.lockCanvas();
        c.drawARGB(255, 0, 0, 0);
        //c.drawBitmap(pic, x-pic.getWidth(), y-pic.getHeight(), null);
        Paint myPaint = new Paint();
        myPaint.setColor(Color.rgb(255, 255, 255));
        myPaint.setAlpha(alpha);
        // TODO implement alpha //myPaint.setAlpha(a);
        c.drawRect(x-100,y-100,x+100,y+100,myPaint);
        holder.unlockCanvasAndPost(c);
        }
        }
}

public void pause(){

    running = false;
    while(true){
        try{
        t.join();
    }catch(InterruptedException e){
        e.printStackTrace();
    }break;
        }

    t = null;
    }

public void resume(){
    running = true;
    t = new Thread(this);
    t.start();
}
}

public boolean onTouch(View v, MotionEvent me) {
    x = me.getX();
    y = me.getY();  
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event){
    if((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE) {
        if(event.getPointerCount() == 2) {
            x = event.getX(0);
            y = event.getY(0);
        }
    }
    return true;
}
//end graphics tutorial
}
4

2 に答える 2

0

で nullExceptionError を取得します。socket = serverSocket.accept() line.

実際にはそうではありません。NullPointerException をスローします。これは、 serverSocketnull でなければならないことを意味します。

これは個別には発生しません。

それがどのような意味でも。

while (!Thread.currentThread().isInterrupted() && socket==null) {

テストのポイントは私をsocket == null逃れます。それが達成するのは、一度に 1 つの接続のみを処理することを保証することだけです。それは本当にあなたの意図ですか?もしそうなら、なぜですか?

于 2013-11-03T08:50:59.347 に答える
0

見る:

try {
    serverSocket = new ServerSocket(SERVERPORT);
} catch (IOException e) {
    e.printStackTrace(); 
}

サーバー ソケットの作成が失敗した場合 (つまり、ポートが既に使用されている場合)、スタック トレースを呼び出して、ソケットが作成されたかのように次の行に進みます。

于 2013-11-03T08:55:12.180 に答える