【问题标题】:Best way handle result from thread on UI处理 UI 上线程结果的最佳方式
【发布时间】:2017-12-04 10:01:07
【问题描述】:

我想将数据保存到新Thread 中的数据库,然后在UI 上显示toast

保存方法:

public void addToBasket(String text) {

        new Thread(() -> {

                //emulate save
                try {
                    Thread.sleep(5000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
              //after that I need say ti UI thread - show Toast!
        }).start();
    }

我称这个方法为:

BasketService.me().addToBasket(result.getContents());

我现在确实想为此使用AsyncTask。请告诉我执行此类任务的最佳方法

【问题讨论】:

标签: android android-runonuithread


【解决方案1】:

使用的电池:

runOnUiThread(new Runnable() {
                public void run() {
                //Do what ever you want do man 
            }
        });

runOnUiThread() 方法从后台线程操作您的 UserInterface

【讨论】:

  • 您不能在 doInBackgroud() 中使用 Toast 和其他 UI 操作,因为您可能会对其进行创建网络操作
  • 是的,这不是最好的方法,但应该与您相关
【解决方案2】:

如果从非 Ui 线程回调到 Ui 线程,您可以使用 runOnUiThread()(如上所述)或 Handler。下面是一个使用 handler 的例子。

 protected static final Handler mainThreadHandler = new Handler(Looper.getMainLooper());

protected void onSuccessInMainThread(final R result, final Bundle bundle) {
    mainThreadHandler.post(new Runnable() {
        @Override
        public void run() {
            callback.onSuccess(result, bundle);
        }
    });
}

protected void onErrorInMainThread(final Exception error) {
    mainThreadHandler.post(new Runnable() {
        @Override
        public void run() {
            callback.onError(error);
        }
    });
}

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2020-07-18
    • 2013-11-27
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多