2013-01-04 163 views
0

我是新來的facebook api和android.But以某種方式嘗試管理登錄到我的Facebook帳戶,並檢索我的帳戶的一些信息,即id,first_name,last_name。創建時使用的sdk(android)此應用程序是sdk(android)級別8,但當我使用sdk(android)級別> 8應用程序崩潰和logcat(networkonmainthreadException)上產生的錯誤。我做了一些搜索,發現這是sdk級別的線程問題,現在我要去爲的AsyncTask但弄糊塗了放在哪裏登錄代碼爲Facebook,什麼事情會回到mainactivityfacebook api with android

我的SDK 8級代碼: -

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 
     loginnfetch=(Button) findViewById(R.id.button1); 
     loginnfetch.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       facebook=new Facebook(APP_ID); 
       restorecredential(facebook); 
       if(!facebook.isSessionValid()) 
       { 
        loginandfetch(); 
       } 
       else 
       { 
        fetch(); 
       } 
      } 
     }); 
    } 

    protected void fetch() 
    { 
     try { 
      JSONObject jobj=new JSONObject(facebook.request("me")); 
      int id=jobj.getInt("id"); 
      String fname=jobj.getString("first_name"); 
      String lname=jobj.getString("last_name"); 
      //String emailid=jobj.getString("email"); 
      Toast.makeText(getApplicationContext(), ".."+id+".."+fname+".."+lname, 0).show(); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    protected void loginandfetch() 
    { 
     facebook.authorize(this, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH,new DialogListener() { 

      @Override 
      public void onFacebookError(FacebookError e) 
      { 
       Toast.makeText(getApplicationContext(), "ERROR WHILE LOGIN", 0).show(); 

      } 

      @Override 
      public void onError(DialogError e) { 
       Toast.makeText(getApplicationContext(), "ERROR WHILE LOGIN", 0).show(); 


      } 

      @Override 
      public void onComplete(Bundle values) { 
       saveCredentials(facebook); 
       fetch(); 
      } 

      @Override 
      public void onCancel() { 

       Toast.makeText(getApplicationContext(), "ERROR WHILE LOGIN", 0).show(); 

      } 
     }); 

    } 

    protected boolean restorecredential(Facebook facebook2) 
    { 
     SharedPreferences sharedPreferences = getApplicationContext() 
       .getSharedPreferences(KEY, Context.MODE_PRIVATE); 
     facebook.setAccessToken(sharedPreferences.getString(TOKEN, null)); 
     facebook.setAccessExpires(sharedPreferences.getLong(EXPIRES, 0)); 
     return facebook.isSessionValid(); 

    } 
    public boolean saveCredentials(Facebook facebook) { 
     Editor editor = getApplicationContext().getSharedPreferences(KEY, 
       Context.MODE_PRIVATE).edit(); 
     editor.putString(TOKEN, facebook.getAccessToken()); 
     editor.putLong(EXPIRES, facebook.getAccessExpires()); 
     return editor.commit(); 
    } 

如果用或某些環節 謝謝和抱歉,如果事情是不正確

回答

0

從ICS及以上版本的Android將不允許在UI thread.It任何網絡操作應在單獨做,請分享一些代碼因此它不會掛起UI.Try您的網絡通信代碼在單獨的線程中。
在你的情況下,使用線程獲取Facebook信息。

試試這個::

if(!facebook.isSessionValid()) 
{ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       loginandfetch(); 
      } 
     }).start(); 
} 
else 
{ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       fetch(); 
      } 
     }).start(); 
} 
+0

我使用的AsyncTask請大家幫我上 – Goutam

+0

你使用的AsyncTask()在哪裏? – AndroidLearner

+0

這裏是我的AsyncTask代碼請讓我知道,如果事情是缺少的:公共無效的onClick(視圖v) \t { \t \t開關(v.getId()) \t \t { \t \t情況下R.id .button1: \t \t \t Loginnfetchtask task = new Loginnfetchtask(); \t \t \t task.execute(APP_ID); \t \t \t中斷;私人\t類Loginnfetchtask延伸的AsyncTask <字符串,整數,長> \t { \t \t \t @Override \t \t 保護\t龍doInBackground(字符串... PARAMS){ \t \t \t實=新Facebook(APP_ID); \t \t \t restorecrediantial(facebook); \t \t \t if(!facebook.isSessionValid()) – Goutam

0

我已經張貼像波紋管的Facebook狀態。你可以嘗試這樣的事情對你的問題:(Facebook的API 3.02b)

Request.Callback callback= new Request.Callback() {     
    public void onCompleted(Response response) { 
     FacebookRequestError error = response.getError(); 
     if (error != null) { 
      Toast.makeText(context, "Failed to Post", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(context, "Successfully Posted", Toast.LENGTH_LONG).show(); 
     } 
    } 
}; 
Request request = new Request(session, victimId+"/feed", bundle, 
            HttpMethod.POST, callback); 

RequestAsyncTask task = new RequestAsyncTask(request); 
task.execute();