2010-12-30 12 views
0

私が取り組んでいるプロジェクトでは、この種の動作が必要です。ユーザーには、サーバーへの接続と切断のオプションを提供するUIが表示されます。また、このUIを使用して、接続のステータス(接続または切断)を表示したいと思います。ユーザーが接続をクリックするたびに、アプリケーションはサーバーへの接続を処理するスレッドを開始します。ユーザーは引き続きメインのUIを見ています。彼らが接続を開始し、接続が残っている間、私は接続の状態が '接続されている'ことを望みます。いずれかの時点で接続が切断された場合は、切断された状態を表示することができます。私はこれまでに何を持っているのですか?Androidスレッドとクラスの動作の質問

私の質問は...私はスレッドの権利をしていますか?それで、電話が接続されている間、サーバー接続によって電話が壊れないようにしますか?

また、サーバーの接続状態を反映するためにメインUIを取得し、接続が壊れたときに表示するにはどうすればよいですか?

ありがとうございます!ご質問がありましたら、お知らせください。

The server connection thread. 

public class ConnectDevice implements Runnable { 

    private boolean connected; 
    private ObjectInputStream ois; 

    public void run() { 
     try { 
      InetAddress host = InetAddress.getByName("192.168.234.1"); 
      Socket socket = new Socket(host.getHostName(), 7777); 
      connected = true; 


      while (connected) { 
       try { 
        ois = new ObjectInputStream(socket.getInputStream()); 
        String message = (String) ois.readObject(); 
        System.out.println("Message: " + message); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      ois.close(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      connected = false; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      connected = false; 
     } /*catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
      connected = false; 
     }*/ 
    } 
} 



The main UI and main class. 

public class SmartApp extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.intro); 

     final Button firstTimeButton = (Button) findViewById(R.id.firstTimeButton); 
     firstTimeButton.setOnClickListener(
     new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       // TODO Auto-generated method stub 
       Intent userCreationIntent = new Intent(v.getContext(), UserCreation.class); 
       startActivityForResult(userCreationIntent, 0); 
      } 
     }); 

     final Button connectDeviceButton = (Button) findViewById(R.id.connectDeviceButton); 
     connectDeviceButton.setOnClickListener(
     new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       //Intent connectDeviceIntent = new Intent(v.getContext(), ConnectDevice.class); 
       //startActivityForResult(connectDeviceIntent, 0); 

       Thread cThread = new Thread(new ConnectDevice()); 
       cThread.start(); 
      } 
     }); 
    } 
} 
+1

私はまったく同じことをやっていますが、明日はそれをお知らせします – Reno

+0

何か助けに感謝します。ありがとう – prolink007

答えて

1

AndroidにはUI要素があり、これはUI要素を更新できる唯一のスレッドです。

あなたは仕事をしているバックグラウンドスレッドを持っている必要があり、完了したらUIスレッドにポストバックする必要があります。 AsyncTaskは、これを行うために設計されたAndroidクラスです。

ワーカースレッドが作業を終了し、findViewByIdで取得したUI要素を更新すると、何もせずに画面上で自動的に変更されます。

1

AsyncTaskをチェックしてください。このタイプのもののために作られました。