线程中的错误()

时间:2015-04-02 20:19:30

标签: java android

这是我的 getAllFriends 方法 Thread

   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_name user.size ,这意味着用户不为空,但是每当我尝试调用 getAllFriends 时,它就会 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

我的错误在哪里?

1 个答案:

答案 0 :(得分: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);很可能尚未完成。所以Toast显示null。您需要确保的是usersgetAllFriends()的分配是在您在另一个线程中访问它之前完成的。使用waitnotify来实现此目的。检查实例this article的基础知识。