我有什么
我有一个自定义光标适配器,我运行一个Thread来执行一些升沉任务。
我想要什么
我希望在线程完成后更新UI,就像显示Toast一样。
我的问题
由于我在自定义游标适配器中,我无法让Activity使用runAnUiThread方法,如getActivity()。runOnUiThread()。 Custom Cursor Adapter类只是一个Java类,而不是Activity或Fragment。
如何从CustomCursorAdapter获取Activity引用并执行runOnUiThread方法?
答案 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。
答案 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()
实现该功能。