0

Facebook SDK を使用して Facebook にログオンするアプリケーションを作成したいと考えています。同じものを使用してログイン機能を実装することに成功しました。(また、非推奨の関数を使用していることにも言及したいと思います。後でさらに別のものに切り替えます。ここで発生している問題を最初に修正したいと思います)。しかし、ログアウト機能の実装に問題がありました。調査を行ったところ、パフォーマンスを向上させるために 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);

私に提案してください!! 私は完全に立ち往生しています。

4

2 に答える 2

1

doInBackground()AsyncTask の呼び出し中に を直接呼び出さないでください。

単にexecute()AsyncTask を実行すると、onPreExecute()、doInBackground()、onProgressUpdate()、および onPostExecute() という特定の実行シーケンスに従います。

したがって、doInBackground() を呼び出す代わりに、execute() を呼び出す必要があります。

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

        }
于 2013-03-09T12:26:12.650 に答える
0

ログアウトするボタンのOnClickですが、これ

new myAsyncClass().doInBackground(fb);
于 2013-03-09T12:19:14.753 に答える