【问题标题】:Android can't create handler inside that has not called Looper.loopAndroid 无法在未调用 Looper.loop 的内部创建处理程序
【发布时间】:2012-12-26 07:43:45
【问题描述】:

我正在从 facebook 获取朋友列表并在列表视图中填充它工作正常但现在我正在尝试添加进度条直到列表视图填充但出现异常我尝试搜索但没有找到我的问题的解决方案,这是我的代码:

public class FriendsProgress extends AsyncTask<Object, Void, Boolean>
    {
        @Override
        protected Boolean doInBackground(Object... Params)
        {
            try
            {
                getFriendList();                                                                    
                friendAdapter = new FriendAdapter(Friends.this, R.layout.activity_friends, friendsList);

                Friends.this.runOnUiThread(new Runnable()
                {
                @Override
                public void run()
                {

                    list.setAdapter(friendAdapter);
                    //list.setOnItemClickListener(EditStaff.this);

                }
                });


            }
            catch (Exception e)
            {
                System.out.println("StaffProgess Exception Caught:"+e.getMessage());
            }
            return Boolean.TRUE;
        }

        @Override
        protected void onPreExecute()
        {

            friendsProgress=new ProgressDialog(Friends.this);
            friendsProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
            friendsProgress.setIndeterminate(true);
            friendsProgress.setMessage("Loading...");       
            friendsProgress.setOwnerActivity(Friends.this);
            friendsProgress.show();

        }

        @Override
        protected void onPostExecute(Boolean Result) 
        {
            friendsProgress.dismiss();
            friendAdapter.notifyDataSetChanged();

        }
    }

这里是getFriendsList函数实现:

public void getFriendList(){

        Request request = Request.newMyFriendsRequest(Session.getActiveSession(), new Request.GraphUserListCallback() {

            @Override
            public void onCompleted(List<GraphUser> users, Response response) {
                // TODO Auto-generated method stub

                for(int i=0; i<users.size();i++)
                {
                GraphUser user =    users.get(i);
                Friend objFriend = new Friend();
                objFriend.setFriendID(user.getId());
                objFriend.setFriendName(user.getName());
                Drawable dd =Friends.LoadImageFromWebOperations("http://graph.facebook.com/" + objFriend.getFriendID() + "/picture");
                objFriend.setFriendPic(dd);
                //objFriend.setFriendPic("http://graph.facebook.com/" + objFriend.getFriendID() + "/picture");
                friendsList.add(objFriend);
                //friendAdapter.notifyDataSetChanged();
                Log.d("Friend's Id", objFriend.getFriendID());
                Log.d("Friend's Name", objFriend.getFriendName());
                //Log.d("Friend's Pic", objFriend.getFriendPic());
                Log.d("Friend's List Count", Integer.toString(friendsList.size()));
                }


        }
    });
    Request.executeBatchAsync(request);

【问题讨论】:

  • 这个问题很模糊;你得到什么样的例外?你试图解决什么问题?我们看这堵代码墙是不合理的;你需要缩小问题范围。
  • 移动 list.setAdapter(friendAdapter);在 onPostExecute 内部并从 doInBackground 中删除 runOnUiThread

标签: android listview progressdialog


【解决方案1】:

您不应该在 doInBackground() 方法中实例化 Adapter 并将其链接到 ListView,因为它在工作线程上运行,并且不允许执行连接到 Android Views 的任何操作一个工作线程。相反,您可能想要移动此代码

friendAdapter = new FriendAdapter(Friends.this, R.layout.activity_friends, friendsList);

            Friends.this.runOnUiThread(new Runnable()
            {
            @Override
            public void run()
            {

                list.setAdapter(friendAdapter);
                //list.setOnItemClickListener(EditStaff.this);

            }
            });

onPostExecute() 方法。这无疑是一个设计更好的解决方案。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    试试这个,

        ProgressDialog dialog;
        protected void onPreExecute()
        {
            dialog = new ProgressDialog(Friends.this);
            dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            dialog.setMax(100);
            dialog.show(); 
        }
    

    【讨论】:

      【解决方案3】:

      onPostExecute()方法中运行Ui线程如下:

       runOnUiThread(new Runnable() {
      
                  @Override
                  public void run() {                                         
                       friendAdapter = new FriendAdapter(Friends.this, R.layout.activity_friends, friendsList);
                       list.setAdapter(friendAdapter);
                       friendsProgress.dismiss();
                       friendAdapter.notifyDataSetChanged();
      
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多