我想创建一个使用Facebook SDK登录facebook的应用程序。 我成功地使用相同的方法实现登录功能。 (我还想提一下我正在使用已弃用的函数,我稍后会切换到更多的东西,我想首先解决我在这里遇到的问题)。 但是我在实现Logout功能方面遇到了问题。我进行了研究,发现我需要在AsyncTasks中实现网络功能以获得更好的性能。那么,我应该使用AsyncTask实现这个功能吗?以下是我的代码。 请建议所需的任何更正,以及进一步的阅读和文章,以清除我的基本概念。我是Android新手,在理解AsyncTasks方面遇到了问题。
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);
请建议我!!我完全被困住了。
答案 0 :(得分:1)
在调用AsyncTask时,不要直接调用doInBackground()
。
你只是 execute()
AsyncTask,它遵循一定的执行顺序,如onPreExecute(),doInBackground(),onProgressUpdate()和onPostExecute()。
因此,您应该调用execute()而不是调用doInBackground()。
if(fb.isSessionValid())
{
new myAsyncClass().execute(fb);
}
答案 1 :(得分:0)
点击按钮,退出但是这个
new myAsyncClass().doInBackground(fb);