2012-04-04 150 views
-1

我有这个应用程序连接到Facebook。出于某种原因,我得到这个错误:Android Facebook更新UI

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

这是我的代码:

活动:

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); 

    } 

怎么了?

回答

2

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

当异步运行程序结束它时,它会在方法本身上执行您的方法,而不是让主线程执行它。

如果你的活动只是在等待图形请求,则不要使用AsyncFacebookRunner但经常的Facebook

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

我以前从来没有这样做过,所以这不是我的个人经验,我没有测试过,但从该教程中的代码看来,您似乎只需将FacebookResponse上的更改为像这样:

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

我不明白。 为什么我写了一个听众。 当AsyncFacebookRunner完成时,它会用响应调用我的侦听器。为什么它不好? – 2012-04-04 14:17:19

+0

监听器只是一种让您知道流程何时完成(失败等)的方式。但它与线程无关。看看这个教程:http://ericosgood.com/prog/facebook-android-sdk-tutorial/到最后它显示如何做你想做的。 – 2012-04-04 14:30:18

+0

是的,我发现,但如果我的RequestListener是在不同的Java类文件中怎么做?它说他在范围内没有我的活动实例。 – 2012-04-04 14:40:26