0

我是 facebook api 和 android 的新手。但是以某种方式尝试管理登录到我的 facebook 帐户并检索我的帐户的一些信息,即 id、first_name、last_name。用于创建此应用程序的 sdk(android) 是 sdk(android) 8 级,但是当我使用 sdk(android) 级别 >8 应用程序崩溃并在 logcat(networkonmainthreadException) 上生成错误时。我做了一些搜索,发现这是 sdk 级别的线程问题,现在我要去 Asynctask,但对去哪里感到困惑输入 facebook 的登录代码,什么东西会返回到 mainactivity

我的 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();
    } 

如果可用,请分享一些代码或一些链接,谢谢,如果有什么不正确,请见谅

4

2 回答 2

0

从 ICS 及以上版本 Android 将不允许在 UI 线程中进行任何网络操作。它应该在单独的线程中完成,这样它就不会挂起 UI。在单独的线程中尝试您的网络通信代码。
在您的情况下,使用线程获取 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();
}
于 2013-01-04T09:47:03.093 回答
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(); 
于 2013-01-04T11:14:10.277 回答