2012-03-20 5 views
0

私は変数の現在の状態を更新するこのプログラムを作成しようとしています。私がどのように動作させるかは、文字列 "update"をサーバーに絶えず送信するための時間を掛けたタスクを持つことです。サーバーは文字列を認識し、アンドロイドデバイスの変数に必要な値を送信します。しかし、私はいくつかの問題に直面しています。文字列「更新」はエラーなしで送信されますが、サーバーからの対応する値が返されると、プログラムは応答を読み取れないように見えます。ソケットインプットストリームから読み込み、アンドロイドUIがフリーズする

  //Open socket and initialize data streams 
    try { 
     socket = new Socket(serverIpAddress, applicationport); 
     //in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     //in = new DataInputStream(socket.getInputStream()); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
       socket.getOutputStream())), true); 
    } catch (UnknownHostException ex) { 
     // TODO Auto-generated catch block 
     ex.printStackTrace(); 
     ShowDialog("Login Error" + ex.getMessage()); 
    } catch (IOException ex) { 
     // TODO Auto-generated catch block 
     ex.printStackTrace(); 
     ShowDialog("Login Error" + ex.getMessage()); 
    } 

    //Create new daemon timer 
    updateData = new Timer(true); 
    updateData.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      out.println("update"); 
      UpdateMethod(); 
      }//run 
     }, 1000, 10000);//schedule the delays start/interval here 



}; 

private void UpdateMethod() { 
    //This method is called directly by the timer 
    //and runs in the same thread as the timer. 
    //It calls the method that will work with the UI 
    //through the runOnUiThread method. 
    this.runOnUiThread(Timer_Tick); 
};//timermethod 

private Runnable Timer_Tick = new Runnable() { 
    public void run() { 
     try { 
      //in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      //String getx1 = null; 
      //getx1 = in.readLine(); 
      //if (getx1 != null) { 
       //float updatex1 = Float.parseFloat(getx1); 
       //get_x1 = getx1; 
       //} 
      in = new DataInputStream(socket.getInputStream()); 
      /*try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
      x1display = (TextView) findViewById(R.id.x1display); 
      x1display.setText(in.readUTF()); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally { 
      if (in != null){ 
       try { 
        in.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
}; 

あなたが見ることができるように、私ものDataInputStreamとBufferedReaderの両方を試してみましたが、無駄にしている:ここでは、コードです。

編集:入力ストリームから読み込もうとすると、UIがフリーズしているようです。私のコードがエラーなしであるように私は何が間違っているのか分かりません。

何か助けや助言をいただければ幸いです!

ありがとうございました!

+0

使用して試してみました: InputStreamはsocket.getInputStream()です。 –

+0

こんにちはHakem、私はこれをどのように実装することができますか詳細に説明できますか? ありがとう – Pooty

+0

私は= new DataInputStream(socket.getInputStream());を置き換えることを意味しました。 InputStreamは= socket.getInputStream();です。私はそれがinputstreamを使用して働いている原因 –

答えて

0

コードはわかりやすく表示されます。しかし、それはあなたがそれを切り刻む必要があるように見えるので、動作しません。

  • タイマーなしでソケットの処理が行われているかどうかをテストします。ソケット接続を作成し、それが動作する場合、タイマおよびUIコードなし

  • をその応答を読んで、タイマーではなく、UIコードそれがはたらく場合

  • を導入、(今失敗している)全体のことを行います

どこかこのテストプロセスで、あなたがすでに言ったように、スレッドのブロックを読んで、犯人

+0

こんにちはopenmobster、私はstackoverflowで投稿する前にこの方法でそれをトラブルシューティングしようとしました。ソケットが正常に動作していて、タイマーが動作していて、サーバーが定期的に「更新」文字列を受信して​​いますが、奇妙な理由のために私の他のボタンに触れたり、アンドロイドクライアント。いずれかのボタンをタップすると、アプリがクラッシュします。 – Pooty

+0

何かがあなたのUIを凍結し、あなたのボタンのように見えるようにクラッシュしています。コードを見ると、TimerTickの下にあるこの行がソケットからの入力を待って凍結される可能性があります:x1display.setText(in.readUTF());これは、UIスレッドで実行されます。たぶん、タイマータスク内のinputstreamを読み込み、パラメータとしてUpdateMethodに値を提供してみてください。 – openmobster

+0

こんにちはopenmobster、それはあなたが正しいようです。私は入力ストリームの読み方がアプリのクラッシュを引き起こしている原因を絞り込んだ。しかし、私のコードが論理的で正しいように見えるように修正する方法はわかりません。これは間違いなくナッツを運転しています。 : – Pooty

0

を見つけることができるはずです。 UIスレッド内で何かを読んではいけません!さらに、私が正しく覚えているように、出力を閉じる前に入力を閉じると、いくつかの厄介なことが起きます。私の代わりにソケットを閉じてに戻ってBufferedReaderのを置くことを示唆している。これは、それはのようになります方法です:。ところで

//Open socket and initialize data streams 
try { 
    socket = new Socket(serverIpAddress, applicationport); 
    in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
      socket.getOutputStream())), true); 
} catch (UnknownHostException ex) { 
    ex.printStackTrace(); 
    ShowDialog("Login Error" + ex.getMessage()); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
    ShowDialog("Login Error" + ex.getMessage()); 
} 

//Create new daemon timer 
updateData = new Timer(true); 
updateData.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     out.println("update"); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        x1display = (TextView) findViewById(R.id.x1display); 
        x1display.setText(in.readUTF()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      }); 
     try { 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }}, 1000, 10000);//schedule the delays start/interval here 

、(のprintStackTraceを使用しないでください):Why is exception.printStackTrace() considered bad practice?

関連する問題