2012-07-19 46 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); 
     } 
    }