从线程回调到调用类

时间:2012-07-19 08:11:35

标签: java multithreading

我目前有一个扩展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...
    }
}

不确定这是不是一个好主意。但如果是这样,我如何创建一个像我的例子中的回调?这有可能吗?

1 个答案:

答案 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);
        }
    }