-1

Facebookに接続するこのアプリケーションがあります。何らかの理由で、次のエラーが発生します。

android.view.ViewRoot$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

これは私のコードです:

アクティビティ:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    app = (AppVariables)getApplicationContext();
    context = getBaseContext();
    facebook = app.getFacebook();
    facebookRunner = new AsyncFacebookRunner(facebook);
    facebookConnection = new FacebookConnection(this);

    internetStatus = (TextView)findViewById(R.id.internetStatus);

    facebookRunner.request("me", facebookConnection);
}

@Override
public void onFacebookResponse(String response) {
    internetStatus.setText(response);
}

これは FacebookConnection クラスです:

public class FacebookConnection implements RequestListener {

    private FacebookConnectionListener listener;

    public FacebookConnection (FacebookConnectionListener listener)
    {
        this.listener = listener;
    }

    public void updateFacebookListener(String response)
    {
        listener.onFacebookResponse(response);
    }

    @Override
    public void onComplete(String response, Object state) {
        updateFacebookListener(response);
    }

    @Override
    public void onIOException(IOException e, Object state) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onFileNotFoundException(FileNotFoundException e, Object state) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onMalformedURLException(MalformedURLException e, Object state) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onFacebookError(FacebookError e, Object state) {
        // TODO Auto-generated method stub

    }
}

そして、これは私のリスナーインターフェースです:

public interface FacebookConnectionListener {

    public void onFacebookResponse(String response);

    }

どうしたの?

4

1 に答える 1

2

すべてのAPIリクエストを非同期的に行うAsyncFacebookRunnerを使用しています。そのために、アクティビティが実行されているメインスレッドとは異なるスレッドを使用します。

非同期ランナーが終了すると、メインスレッドに実行させるのではなく、onFacebookResponseメソッド自体を実行します。

アクティビティがグラフリクエストを待っているだけの場合は、AsyncFacebookRunnerではなく通常のFacebookを使用してください。

そうでない場合は、アクティビティでデータが返されたかどうかを確認し、返された場合は元のスレッドで更新する必要があります。

私はこれまでこれを行う必要がなかったので、これは私の個人的な経験によるものではなく、テストもしていませんが、そのチュートリアルのコードから、onFacebookResponseを次のようなものに変更する必要があるようです。

public void onFacebookResponse(String response) {
    this.runOnUiThread(new Runnable() {
        public void run() {
            this.internetStatus.setText(response);
        }
    });
}
于 2012-04-04T14:01:50.630 に答える