1

USBケーブルを介してコンピューターに接続されているAndroidアプリケーションがあります。TCPServerクラスを使用してメッセージを送信し、リッスンします。例えば:

次のようなメッセージを送信すると、request:x
という応答が返されます:response:x:55

受け取った応答に応じて、アクティビティを変更する必要があります。現時点では、アクティビティとアクティビティクラスオブジェクトをTCPServerのコンストラクタに渡すことで、一時的に問題を解決しました。

public TCPServer(int portNum, Activity activity, IntroActivity ia) {
    super();
    port = portNum;
    this.activity = activity;
    this.ia = ia;
}    

次に、応答を受け取った後:

void updateButton(final int color, final String txt) {
    activity.runOnUiThread(new Runnable() {
         public void run() {
             ia.getConnectionButton().setBackgroundColor(color);
             ia.getConnectionButton().setText(txt);
        }
    });
}   

ご覧のとおり、これはまったく効果的ではありません。関連する変数を受信するたびに、何らかの方法でアクティビティに通知する必要があります。GlobalVariablesのクラスを使用し、listen()の後でこれらの静的変数を変更しましたが、アクティビティの通知に問題があります。

4

1 に答える 1

5

まず第一に、Activity インスタンスを渡すことは、ほとんどの場合、悪い習慣です。調子が悪い時期です。

インターフェイスを定義し、コールバックを使用して、応答が受信されたことをアクティビティに知らせます。

public interface ResponseReceivedListener {
    void onResponseReceived(int arg1, string arg2); // <- add arguments you want to pass back
}

TCPServer クラスで:

ArrayList<ResponseReceivedListener> listeners = new ArrayList<>();

// ...

public void setResponseReceivedListener(ResponseReceivedListener listener) {
    if (!listeners.contains(listener) {
        listeners.add(listener);
    }
}

public void removeResponseReceivedListener(ResponseReceivedListener listener) {
    if (listeners.contains(listener) {
        listeners.remove(listener);
    }
}

応答を受け取ったら:

for (ResponseReceivedListener listener : listeners) {
   listener.onResponseReceived(arg1, arg2);
}

アクティビティで:

public class MainActivity extends Activity implements ResponseReceivedListener {

    // ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...

        tcpServer.setResponseReceivedListener(this);

        // ...
    }

    public void onResponseReceived(int arg1, string arg2) {
        // do whatever you need to do
    }

    // ...
}

全て記憶ですので誤字脱字はご容赦ください。

このアプローチにより、クラスが分離されます。TCP サーバーはアクティビティを認識していません。登録されているリスナーにコールバックするだけです。これらのリスナーはアクティビティである場合もあれば、サービスである場合もあります。それらは、MySparklyUnicorn のインスタンスである可能性があります。サーバーは認識も気にもしません。それは単に「誰かが興味を持っているなら、私は応答を受け取りました、そしてここに詳細があります」と言っています.

于 2013-02-02T10:11:25.937 に答える