我有一个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 ?
}
答案 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);
}
};