-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

您正在使用AsyncFacebookRunner以异步方式发出所有 API 请求。为此,它使用与运行活动的主线程不同的线程。

当异步运行器完成它时,它会自行执行您的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 回答