从Custom CursorAdapter运行RunOnUIThread

时间:2014-07-28 03:58:28

标签: android multithreading android-activity cursor

我有什么

我有一个自定义光标适配器,我运行一个Thread来执行一些升沉任务。

我想要什么

我希望在线程完成后更新UI,就像显示Toast一样。

我的问题

由于我在自定义游标适配器中,我无法让Activity使用runAnUiThread方法,如getActivity()。runOnUiThread()。 Custom Cursor Adapter类只是一个Java类,而不是Activity或Fragment。

如何从CustomCursorAdapter获取Activity引用并执行runOnUiThread方法?

6 个答案:

答案 0 :(得分:6)

您需要以某种方式将活动的引用传递给适配器。然后通过一些演员或使用接口,你可以调用((YourActivity)context).runOnUiThread()

对于访问片段管理器,您需要进行相同的转换。

((YourActivity)context).getFragmentManager()

但请注意!这不是一个好的设计模式。如果context不是活动,您很快就会处理大量的NPE异常和内容。例如,ApplicationContext没有getFragmentManager但是当您进行上面的转换时,您的IDE将不会通知您,当您在模拟器或设备上实际尝试时,您会发现它。

使用接口更安全一些,至少你知道你的活动实现了哪个接口。

答案 1 :(得分:3)

  

晚些时候可以帮助我,我知道答案已经在这里,但它可以帮助其他人

如果U具有Adapter (RecyclerView Adapter,Viewpager Adapter... etc),并且在此适配器中您正在使用AsyncTask,而您想使用AsyncTask来更改数据

((Activity)contextObject).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //change View Data
                }
            });

答案 2 :(得分:2)

  ((AppCompatActivity) context).runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {

                                            //context.refreshInbox();
                                        }
                                    });

答案 3 :(得分:0)

最好是在AsyncTask中运行后台作业,并在Asyntask在UI线程上运行时在onPostExecute中更新UI。

查看此处:https://stackoverflow.com/a/12003493

答案 4 :(得分:0)

有了Context,您可以在任何类中创建Handler。否则,您可以调用Looper.getMainLooper()

    new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        // code goes here
    }
});

答案 5 :(得分:-3)

在调用/创建自定义游标适配器对象时,需要在该构造函数中传递“context”,即getApplicationContext()/ ActivityName.this。

您需要在自定义游标适配器类中使用该上下文对象。因此,只需在调用runOnUiThread()时,您就可以使用

        context.runOnUiThread()

实现该功能。