我需要从 runnable 更新 ui。我的逻辑如下。 我从 fragment 生命周期的 onCreate 开始运行。可运行实例负责请求网络。问题是我不知道如何在可运行实例从网络获取数据后更新 fragment 。
在 CustomFragment.java 的 fragment 中启动 runnable 的代码。
public void onCreate(Bundle savedInstanceState) {
Log.d(DEBUG_TAG, "onCreate");
super.onCreate(savedInstanceState);
accountMgr.requestAccountInfo();
}
在 AccountManager.java 中开始运行的代码
/**
* request Account info from server
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void requestAccountInfo() {
Account act = getCurrentAccount();
Thread t = new Thread(new RequestAccountInfoTask(act));
t.start();
}
/**
* automatically update Account info, like space usage, total space size, from background.
*/
class RequestAccountInfoTask implements Runnable {
private Account account;
public RequestAccountInfoTask(Account account) {
this.account = account;
}
@Override
public void run() {
doRequestAccountInfo(account);
}
}
最佳答案
runOnUiThread()
需要 Activity
引用。还有其他选择。您不需要 Activity
引用您的 Thread
。您始终可以使用主循环程序获取 UI 处理程序。传递其他参数(例如您的界面)以在完成您的任务后更新 fragment 。
class RequestAccountInfoTask implements Runnable {
private Account account;
private Handler mHandler;
public RequestAccountInfoTask(Account account) {
this.account = account;
mHandler = new Handler(Looper.getMainLooper());
}
@Override
public void run() {
doRequestAccountInfo(account);
//use the handler
}
}
您在实例化的 Handler
上运行的任何内容都将在 UI 线程上运行。
当然,使用runOnUiThread()
是完全合理的。
关于java - 如何从 Runnable 更新 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27415236/