2015-04-02 90 views
0

這是我getAllFriends主題錯誤線程()

ArrayList<User> users; 
    private void getAllFriends() 
{ 
    new Thread(){ 
     @Override 
     public void run(){ 
      try { 
       api=new Api(Account.access_token, Constants.API_ID); 
       users = api.getFriends(Account.user_id,"name",null,null,null); 
       user_name = users.get(0).first_name; 
       api = null; 

       runOnUiThread(successRunnableFriends); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }.start(); 
} 
Runnable successRunnableFriends = new Runnable(){ 
    @Override 
    public void run() { 
     user_name = users.get(0).first_name; 
     Toast.makeText(c, String.valueOf(users.size()), Toast.LENGTH_LONG).show(); // Shows 166 
    } 
}; 

它給了我一定的USER_NAMEuser.size,這意味着用戶在不爲空, 但是每當我嘗試致電getAllFriends,它Toastes null

public void getFriends(Context _c) { 
    c = _c; 
    getAllFriends(); 
    if(users.size() == 0) 
     Toast.makeText(c,String.valueOf(user_name), Toast.LENGTH_LONG).show();//null 

我的錯誤在哪裏?

+0

'getAllFriends'不返回任何東西(它的返回類型是void)。 – immibis 2015-04-02 20:20:18

+0

@immibis it Toastes null – Zhambulable 2015-04-02 20:22:10

+0

你的代碼是不可理解的。 Api.getFriends接受5個參數,而getFriends接受一個參數。發佈一個更完整的代碼,以便我們可以分析 – Snake 2015-04-02 20:26:19

回答

1

如果你確信你在getAllFriends()線程的線程successRunnableFriends之前肯定是在運行,那麼你可能有一個問題與

ArrayList<User> users; 

聲明這應該寧可

volatile ArrayList<User> users; 

因爲否則允許JVM爲新啓動的線程取現值。

檢查這個不錯的article

p.s.:如果volatile不起作用,請考慮以下事項。在時間點

if(users.size() == 0) 
    Toast.makeText(c,String.valueOf(user_name), Toast.LENGTH_LONG).show(); 

執行api.getFriends(Account.user_id,"name",null,null,null);最有可能尚未完成。所以吐司顯示null。您必須確保在getAllFriends()中的users的分配在您在另一個線程中訪問之前完成。使用waitnotify來實現這一點。檢查實例this article的基本知識。

+0

它仍然給出一個空 – Zhambulable 2015-04-02 20:36:20

+0

你真的確定'用戶'至少填充了一個項目,並且'successRunnableFriends'正在運行之前? – Trinimon 2015-04-02 20:39:16

+0

好吧,在你的行'if(users.size()== 0)Toast.makeText ...'你使用的成員user_name'也可能在另一個線程中分配。如果我是對的,你也必須聲明'user_name'和volatile。但是,順便說一句,爲什麼你要檢查'users.size()== 0'?在這種情況下'user_name'永遠不會在'user_name = users.get(0).first_name'中被賦值,因爲你試圖用'get()'引用一個不存在的項。它將在'catch'塊中結束.... – Trinimon 2015-04-02 20:45:29