Android使用处理程序将数据从TCP线程发送到不同的活动

时间:2012-08-07 17:21:14

标签: android multithreading tcp handler

我有一个MainActivity默认启动Activity,它创建一个TCP工作线程。 此TCP线程从服务器接收一些数据并将其传递给当前显示的活动,表示还有两个名为Activity1和Activity2的活动将显示接收的数据。

我如何使用处理程序实现此目的?  以下是我所拥有的概要......如果我完全错了,请提出解决方案或更改所有内容。

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 Thread Class ---- -----------------------------

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 ...... / p>

基本上,目录对象是字符串的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 ?
}

1 个答案:

答案 0 :(得分:1)

首先:处理程序执行runnables并处理创建它的线程中的消息。因此,如果您希望Activity1对来自TCPFunction的数据做出反应,您有两个选择。之一:

-MainActivity,它在当前代码中创建了处理程序,需要对消息作出反应,获取数据并将其发送到Activity1

-Or Activity1需要是创建处理程序的那个。

在任何一种情况下,您对如何对已发送消息作出反应的问题的核心答案是,您需要通过子类化处理程序来覆盖handleMessage()方法。这是您可以使用的样板代码段(从Android开发人员网站上的一个示例应用程序中提取)

        mUpdateHandler = new Handler() {
            @Override
        public void handleMessage(Message msg) {
            String chatLine = msg.getData().getString("msg");
            addChatLine(chatLine);
        }
    };