从线程回调呼叫类
问题描述:
我目前有一个类扩展Thread
。在那个类中,我得到了一个网页的内容(这只是JSON数据),我解析了它。这取决于我得到的JSON对象,因为这决定了我要采取的操作或我必须展示的视图。从线程回调呼叫类
但我目前这样做的方式是我在一个类中检查所有可能的JSON请求并根据它执行操作。
例子,我班还挺看起来是这样的:
public class Communicator extends Thread
{
Thread threadToInterrupt = null;
String URL = null;
public Houses (String URL)
{
threadToInterrupt = Thread.currentThread();
setDaemon(true);
this.URL = URL;
}
public void run()
{
// Code to get the JSON from a web page
// Finally parse the result into a String
String page = sb.toString();
JSONObject jObject = new JSONObject(page);
if (!jObject.isNull("house"))
{
// do alot of stuff
}
else if (!jObject.isNull("somethingelse"))
{
// do alot of other stuff
}
}
}
正如你可以想像,这个类很快就会有很多JSON检查和代码的混乱。这并不觉得这是正确的方式。
我想,也许最好传递一个回调方法来调用?这样我可以我的类更改为这样的事情:
public class Communicator extends Thread
{
Thread threadToInterrupt = null;
String URL = null;
public Houses (String URL, String JsonString, object CallbackMethod)
{
// ... code
}
public void run()
{
// ....
JSONObject jObject = new JSONObject(page);
if (!jObject.isNull(this.JsonString))
{
// THen call the CallbackMethod...
CallbackMethod (jObject);
}
}
}
public class MyClass
{
public void MyFunc()
{
(new Communicator("http://url.tld", "House", this.MyCallback)).start();
}
public void MyCallback(JSONObject jObject)
{
// Then i can perform actions here...
}
}
不知道这是一个好主意。但如果是这样,我如何创建一个像我的例子中的回调?这有可能吗?
答
你不会使用回调,但处理的物体,像MyJsonHandler:
public class MyClass
{
public void MyFunc()
{
(new Communicator("http://url.tld", "House", new MyJsonHandler())).start();
}
}
public class MyJsonHandler() {
public void handle(JsonObject jo) {
// ...
}
}
或者只是在地方创建一个新的MyJsonHandler当你需要:
public void run()
{
// ....
JSONObject jObject = new JSONObject(page);
if (!jObject.isNull(this.JsonString))
{
// THen call the CallbackMethod...
new MyJsonHandler().handle(jObject);
}
}