2010-11-28 22 views
0

私の問題は、おそらく、同時に簡単で厄介なものになるだろうが、私はちょっと立ち往生している。Android:スレッドからアクティビティを呼び出す

私はActivityを拡張するMain.javaクラスを持っています。そのクラス内

、私は次の操作を行います

ringerServer = new Thread(new RingerServer()); 
ringerServer.start(); 

は、私は何をしたいRingerServerスレッドが継続的に実行されています。

そのスレッドの中で、私はTCP接続を待ち受けます。私が1つを取得すると、私はUDPパケットを送受信する別のクラスを開始します。

public class RingerServer implements Runnable { 

    public static final int SERVERPORT = 4445; // Default port to connect to 

    @Override 
    public void run() { 
     try { 
      // Create a socket for handling incoming requests 
      ServerSocket server = new ServerSocket(SERVERPORT); 

      while (!VoIPCall.onCall) { 
       // Wait for an incoming connection 
       Socket clientSocket = server.accept(); 

       // TODO: Display a message for the user to accept or decline 

       // For now, automatically accept the call 
       Intent myIntent = new Intent(null, VoIPCall.class); 
       // Put the IP as a parameter 
       myIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
       startActivity(myIntent); 
      } 

     } catch (IOException e) { 
      Log.e("TCP", "S: Error", e); 
     } 
    } 
} 

私の問題は、ラインに関係しています:

Intent myIntent = new Intent(null, VoIPCall.class); 
myIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
startActivity(myIntent); 

それらのラインが活動内で正常に動作しますが、それはそれはスレッドがあるとして、それは知りません文句をしませんActivityクラスは、それを拡張しないため、Runnableを実装しているためです。

私のプログラムでRingerServerがどのように動作するのかよく分かりませんが、メインスレッドはVoIPCallクラスに移動してください。どんなアイデアですか?

本当にありがとうございます。

あなたはむしろ活性よりもServiceにあなたのスレッドを移動する必要があります

Jary

+0

コードの1つの問題は、コンテキストとしてnullをインテントに渡すことです。その呼び出しが機能するには、実際のContextオブジェクトを渡す必要があります。あなたのスレッドを別のクラスにしたいのであれば、恐らくContextを引数として持つコンストラクタを作成するべきでしょう。アクティビティまたはサービスのインスタンスで、スレッドをインスタンス化してコンストラクタに渡すことができます。 – elevine

答えて

1

、どうもありがとうございました。 AndroidデベロッパーガイドのProcesses and Threadsセクションを読むことをお勧めします。その後、ServiceのAPIドキュメントをチェックアウトしてください。作成するのに役立ちます。

+0

私はスレッドとプロセスの違いを読んで、サービスの読み込みを始めましたが、「サービスはスレッドではありません。アプリケーションが応答しないというエラーを避けるために、 )。 "なぜ私のRingerServerがそのステートメントのためにスレッドではなくサービスに移動されるべきなのか分かりません。私にその理由を説明してもらえますか? – Jary

+1

アクティビティのライフサイクルは、ユーザのアクティビティの相互作用に依存します。ユーザーがアクティビティから離れると、Androidフレームワークによって殺される危険があります。一方、サービスのライフサイクルは、ユーザーとのやりとりに結びつくものではなく、長時間実行される操作を実行するためのものです。あなたはまだあなたのサービス内にスレッドを作成する必要があります。 Looper、Handler、およびHandlerThreadは、この目的のために検討する価値のあるクラスです。 – elevine

関連する問題