2013-03-09 82 views
0

我想創建一個使用Facebook SDK登錄Facebook的應用程序。 我成功實現了使用相同的登錄功能。 (我還想提到我使用的是已棄用的函數,以後我會切換到更多的東西,我想先解決我在這裏遇到的問題)。 但是我在實現註銷功能時遇到了問題。我做了我的研究,發現我需要在AsyncTasks中實現網絡功能以獲得更好的性能。那麼,我應該使用AsyncTask來實現這個功能嗎?以下是我的代碼。 請建議所需的任何更正,並進一步閱讀和文章,以清除我的基本概念。我是Android新手,在理解AsyncTasks時遇到問題。使用AsyncTask爲Facebook使用Facebook SDK實現註銷功能

public void onClick(View v) { 
    // TODO Auto-generated method stub 

    switch(v.getId()){ 
    case R.id.fb_button: 

     try{ 
     if(fb.isSessionValid()) 
     { 
new myAsyncClass().doInBackground(fb); 
      //button close session 
     } 

     else 
     { 
      fb.authorize(LoginPage.this, new DialogListener(){ 

       @Override 
       public void onFacebookError(FacebookError e) 
       { 
        Toast.makeText(LoginPage.this, "on Facebook error", Toast.LENGTH_SHORT).show(); 
       } 
       @Override 
       public void onError(DialogError e) 
       { 
        Toast.makeText(LoginPage.this, "on error", Toast.LENGTH_SHORT).show(); 
       } 
       @Override 
       public void onComplete(Bundle values) 
       { 
        update_fb_buttonimage(); 

        Toast.makeText(getBaseContext(), "onComplete works",Toast.LENGTH_LONG).show(); 
       } 
       @Override 
       public void onCancel() 
       { 

       } 
      }); 
      //login in to facebook 
     } 

     }catch(Exception e){ 

      Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show(); 

     } 

我的AsyncTask類如下....

private class myAsyncClass extends AsyncTask<Facebook, Void, Void>{ 

    protected void onPreExecute() { 
      // update the UI immediately after the task is executed 
      super.onPreExecute(); 



      } 

    @Override 

    protected Void doInBackground(Facebook... arg0) { 
     // TODO Auto-generated method stub 
     Facebook fb=arg0[0]; 
     try { 
      fb.logout(getApplicationContext()); 
      update_fb_buttonimage(); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



     return null; 
    } 

所以在我的開關情況下,如果會話是無效的,我在我的按鈕,我得到登錄到Facebook的點擊沒有任何問題 和我的觀點(按鈕)也得到更新。 但是當會話有效,我得到了著名的例外

android.os.networkonmainthreadexception 

,我應該把我的

new myAsyncClass().doInBackground(fb); 

請建議我!我完全堅持。

回答

1

不要直接調用的同時一個的AsyncTask調用doInBackground()

只需​​所述的AsyncTask和它遵循執行的特定序列作爲onPreExecute(),doInBackground(),onProgressUpdate()和onPostExecute()。

所以,不要調用doInBackground(),而應該調用execute()。

if(fb.isSessionValid()) 
     { 
      new myAsyncClass().execute(fb); 

     } 
+0

我做了你所告訴的。但現在我的應用程序崩潰 – user2056245 2013-03-09 12:40:53

+0

您可以請發佈LogCat? – Swayam 2013-03-09 12:43:07

+0

我可以給你發送整個代碼嗎?在Facebook上也許? – user2056245 2013-03-09 12:49:06

0

的OnClick上按鈕,退出但這

new myAsyncClass().doInBackground(fb); 
+0

對不起,先生,我不明白你。你能否詳細說明一下?這將會非常棒。謝謝你 – user2056245 2013-03-09 12:23:13

+0

@ user2056245你想註銷的地方fb有沒有按鈕? – DjHacktorReborn 2013-03-09 12:27:27

+0

是的,我用於登錄的相同按鈕,這是在主UI線程 – user2056245 2013-03-09 12:31:37