2012-07-19 47 views
0

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

你不会使用回调,但处理的物体,像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); 
     } 
    }