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