我目前有一个扩展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...
}
}
不确定这是不是一个好主意。但如果是这样,我如何创建一个像我的例子中的回调?这有可能吗?
答案 0 :(得分:0)
您不会使用回调,而是使用像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);
}
}