安卓Facebook更新用户界面



我有一个连接到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);
    }

怎么了?

您正在使用AsyncFacebookRunner,它以异步方式发出所有API请求。要做到这一点,它使用了一个不同于运行活动的主线程的线程。

当异步运行程序完成它时,它会自己执行onFacebookResponse方法,而不是让主线程执行它

如果您的活动只是在等待图形请求,那么不要使用AsyncFacebookRunner,而是使用常规的Facebook

如果没有,那么您的活动应该检查数据是否返回,如果返回,则在原始线程中更新数据。

我以前从来没有这样做过,所以这不是根据我的个人经验,我也没有测试过,但从教程中的代码来看,你似乎只需要将onFacebookResponse更改为这样的东西:

public void onFacebookResponse(String response) {
    this.runOnUiThread(new Runnable() {
        public void run() {
            this.internetStatus.setText(response);
        }
    });
}

最新更新