1

TCP ワーカー スレッドを作成するデフォルトの起動アクティビティである MainActivity があります。この TCP スレッドは、サーバーから一部のデータを受信し、表示されている現在のアクティビティにそれを渡します。たとえば、受信したデータを表示する Activity1 と Activity2 という 2 つのアクティビティがあります。

Handlers を使用してこれを達成するにはどうすればよいですか? これが私が持っているものの概要です...私が完全に間違っている場合は、解決策を提案するか、すべてを変更してください。

public class MainActivity extends Activity
{
    public static TCPFunctions tcp = null;
    public static Handler handler;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        handler = new Handler();
        tcp = new TCPFunctions(this, handler);
        tcp.start();
    }
}

------------------------------TCP スレッド クラス ------- --------------------------

public class TCPFunctions extends Thread
{
    public Handler handler;
    //socket and io streams are here and they work properly

    Public TCPFunctions(MainActivity main, Handler _handler)
    {
        this.main = main;
    handler = _handler;
    }

    public void run()
    {
        Intent showActivity1 = new Intent(main, Activity1.class);
        main.startActivity(showActivity1);
        while(true)
        {
            directories = new Vector<String>();
            directories = (Vector<String>) inputStream.readObject();
            Message msg = Message.obtain();
            msg.obj = directories;
            handler.sendMessage(msg);
            directories = null;
        }
    }
}

ここで、Activity1 で、このディレクトリ オブジェクトが必要だとします...Activity1 にボタンがあるとします。このボタンを押すと、ディレクトリ オブジェクトを取得するようにサーバーに要求が送信されます...これは TCP スレッドによって受信されます...どうすればよいでしょうかActivity1 でこれを取得し、UI を更新します...

基本的に、ディレクトリ オブジェクトは文字列の Vetor であり、Activity1/Activity2 に含まれる ListView に文字列を表示したい

public class Activity1 extends Activity implements OnClickListener,OnItemClickListener
{
    private ListView directoryList;
    private Button rootButton;
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fileexplorer);
        directoryList = (ListView) findViewById(R.id.directories);
        rootButton.setOnClickListener(this);
        directoryList.setOnItemClickListener(this);
    }

    public void onClick(View v)
    {
        switch(v.getId())
        {
            case R.id.root_button:
            Log.d(TAG, "FileExplorer: Root Button Pressed");
            //request for directories made here
            break;
        }
    }
 // What should be the Handler code to get the directories ?
}
4

1 に答える 1

1

最初: ハンドラーはランナブルを実行し、それを作成したスレッドでメッセージを処理します。したがって、Activity1 を TCPFunctions からのデータに反応させたい場合は、2 つのオプションがあります。また:

-現在のコードでハンドラーを作成した MainActivity は、メッセージに反応し、データを取得して、それを Activity1 に送信する必要があります。

-または、Activity1 がハンドラーを作成する必要があります。

どちらの場合でも、送信されたメッセージにどのように反応するかという質問に対する主な答えは、ハンドラーをサブクラス化して handleMessage() メソッドをオーバーライドする必要があるということです。使用できるボイラープレート スニペットを次に示します (Android デベロッパー Web サイトのサンプル アプリの 1 つから取得)。

        mUpdateHandler = new Handler() {
            @Override
        public void handleMessage(Message msg) {
            String chatLine = msg.getData().getString("msg");
            addChatLine(chatLine);
        }
    };
于 2012-08-07T18:07:21.720 に答える