2012-12-26 22 views
1

我從Facebook獲取朋友列表和填充列表視圖它工作正常,但現在我想添加進度欄,直到列表視圖填充,但獲得異常我試圖尋找,但沒有找到解決方案,我的問題,這是我的代碼:Android不能創建處理程序裏面沒有叫Looper.loop

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); 
+0

這個問題是很模糊的,你得到了什麼樣的例外?你試圖解決什麼問題?我們看這段代碼是不合理的;你需要縮小這個問題。 – Richard

+1

move list.setAdapter(friendAdapter);在onPostExecute裏面並從doInBackground中移除runOnUiThread –

回答

2

你不應該實例化一個Adapter並將其鏈接到一個ListViewdoInBackground()方法,因爲它在工作線程上運行,並且沒有任何連接到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()方法。這當然是一個更好的設計解決方案。希望這可以幫助。

0

試試這個,

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

運行UI線程內onPostExecute()方法如下:

runOnUiThread(new Runnable() { 

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

      } 
     }); 
相關問題