标签: background-thread

Flutter:如何在 dart 的后台线程上运行函数

Future getImage() async {
 var image = await ImagePicker.pickImage(source: ImageSource.camera);
 setState(() {
   _image = image;
   print("IMG:" + _image.toString());
 });
 setPrefs() ;
}

Future setPrefs() async {
 _base64 = base64.encode(_image.readAsBytesSync());
 print(_base64);
 final prefs = await SharedPreferences.getInstance();
 prefs.setString(IMAGE_KEY, _base64);

}
Run Code Online (Sandbox Code Playgroud)

readAsBytesSync()方法在 Android 上运行良好,但在 iOS 中速度太慢。那么如何将此代码移动到新的后台线程?

asynchronous async-await background-thread dart flutter

7
推荐指数
1
解决办法
6335
查看次数

在java中创建后台线程的最佳方法

创建后台线程的最佳方法是什么,每15分钟运行一次以从数据库中获取数据?

下面是我所拥有的代码,我认为它在生产中会正常工作,但是我还有其他更好的方法或我应该注意的事情吗?

private static void checkDatabaseEveryXMinutes() {
    new Thread() {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(checkingAfterEveryXMinutes);
                    getDataFromDatabase();
                } catch (InterruptedException ex) {
                    //log here
                } catch (Exception e) {
                    //log here
                }
            }
        }
    }.start();
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码有什么不利之处.ScheduledExecutorService与TimerTask的比较如何?

哪种方式更好?

如果有更好的方法,我会对此代码的任何示例基础表示赞赏.

java multithreading background-thread

6
推荐指数
1
解决办法
2万
查看次数

android addView在后台线程中

我需要在循环中添加大量视图,而这个片段就是这样,应用程序还将有一个导航抽屉和操作栏,用户可以在其中执行操作.

所以我希望这个过程不会a)通过阻止用户来减慢app的速度,b)最好在后台线程中添加视图.

困境是我认为android不喜欢在非UI线程中添加视图,所以有最佳实践吗?我计划在片段视图中显示进度条视图对象,而其余视图是使用addView和相关计算生成的

android views ui-thread background-thread

6
推荐指数
1
解决办法
4496
查看次数

如何在后台线程中为QFileSystemModel创建自定义图标

我在qt中为一些自定义设计文件制作文件浏览器.我想加载他们的预览作为他们的缩略图,因此我QIconProvider用来将Icon返回给我QFileSystemModel.

问题是创建的算法QIcon需要一些资源,因此我的应用程序在完成加载所有缩略图之后才会响应.

我想知道是否有任何方法可以将我QIconProvider放在后台线程中,以便我的应用程序响应.

qt thumbnails qfilesystemmodel background-thread qicon

6
推荐指数
2
解决办法
824
查看次数

如果我无限期地在后台运行 Android 线程会发生什么

Android 文档表明 Oreo 对后台执行有新的限制:https://developer.android.com/about/versions/oreo/background。这看起来很合理,他们的目标显然是让自己的平台更像 iOS,并防止应用程序在后台猖獗运行。

我不清楚(事实上,根本没有记录)是当 UI 转到后台时你可以在线程上做什么。具体来说,

鉴于我创建了一个线程

new Thread(() -> { 
     // Naughty thread doing something forever
}).start();
Run Code Online (Sandbox Code Playgroud)

我将应用程序发送到后台

那么...该线程会发生什么?

我创建了非常简单的代码来执行此操作,并且我的线程已经愉快地在 logcat 上运行了 10 多分钟,没有出现任何问题。

有谁有关于此类线程有哪些限制的明确信息?我本以为,由于 Android 限制了后台服务可以执行的操作,因此它也会限制此类线程可以执行的操作。

请注意,我们没有计划编写一个执行此类操作的应用程序。我们只是希望能够编写安全的代码,不会在较新版本的 Android 上引起问题。在 iOS 上,如果您进入后台,那么您将获得一段宽限期来完成您正在做的任何事情(并且您可以要求更多时间),但最终您的线程将被挂起。

multithreading android background-thread android-8.0-oreo

6
推荐指数
1
解决办法
2843
查看次数

如何在构建GUI时加载Swing时更新/绘制JProgressBar

我有一个GUI,它在运行它的平台上构建/初始化非常繁重.因此我想在初始化时更新进度..

我有一个小的未修饰的JDialog包含一个JLabel和一个JProgressBar,我想在初始化期间在特定的地方更新,但是,因为事件调度thead(根据Swing规则)用于构建/初始化GUI,进展当然是直到EDT再次空闲(即初始化完成)才更新..

JProgressBar我已经使用"paintImmediately"重绘了,但我似乎无法让它适用于JLabel和对话框本身..是否有任何简单的推荐/证明方法来实现这一目标?

干杯...

编辑:添加一个我正在尝试做的例子; 当然,大大简化了.

private JLabel progressLabel;
private JProgressBar progressBar;

public static int main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            showProgressDialog();
            progressLabel.setText("construct 1");

            constructSomeHeavyGUI();

            progressLabel.setText("construct 2");
            progressBar.setValue(33);

            constructSomeMoreHeavyGUI();

            progressLabel.setText("construct 3");
            progressBar.setValue(67);

            constructEvenMoreHeavyGUI();

            progressLabel.setText("done");
            progressBar.setValue(100);

            hideProgressDialog();

            showHeavyGUI();

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

只要EDT忙碌,并且在我们全部完成而不是一路更新之后,由progressBar.setValue()/ progressLabel.setText()上面的呼叫引起的重新绘制当然会排队等待.

java swing event-dispatch-thread background-thread

5
推荐指数
1
解决办法
5616
查看次数

来自后台线程的模态消息框

我注意到当 MessageBox 处于模式状态时,行为似乎不一致。

首先,从 UI 线程启动 MessageBox。这会产生一个模态 MessageBox,正如预期的那样:

void MainThreadClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Hello!");
    }
Run Code Online (Sandbox Code Playgroud)

接下来,从后台线程启动。这会导致无模式 MessageBox,我猜是因为它不在 UI 线程上?

void WorkerThreadClick(object sender, RoutedEventArgs e)
    {
        ThreadPool.QueueUserWorkItem((x) =>
        {
            MessageBox.Show("Hello!");
        });
    }
Run Code Online (Sandbox Code Playgroud)

接下来,从后台线程启动,但分派到 UI 线程,导致它再次成为模态:

void WorkerThreadClick(object sender, RoutedEventArgs e)
    {
        ThreadPool.QueueUserWorkItem((x) =>
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                MessageBox.Show("Hello!");
            });
        });
    }
Run Code Online (Sandbox Code Playgroud)

最后,这是一个奇怪的问题,与上面类似,但使用 FileSystemWatcher 线程会导致无模式对话框。为什么是这样?...它是在 UI 线程上调用的,那么为什么它不像前面的示例那样是模态的呢?

public MainWindow()
    {
        InitializeComponent();

        m_watcher = new FileSystemWatcher()
        {
            Path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
            NotifyFilter = NotifyFilters.LastWrite,
            IncludeSubdirectories = true,
            Filter = "*.*"
        };

        m_watcher.Changed += …
Run Code Online (Sandbox Code Playgroud)

wpf modal-dialog messagebox background-thread

5
推荐指数
1
解决办法
1379
查看次数

HandlerThread中的NullPointerException

这个错误困扰了我好几个小时.我收到了NullPointerException.问题是这个错误不一致.它发生在我启动应用程序时,但只是偶尔发生.所以我不确定是什么导致它.

我为错误日志的冗长问题道歉,但我找不到另一种询问方式.

错误日志如下:

FATAL EXCEPTION: main
Process: com.myproject.android, PID: 22175
java.lang.NullPointerException
    at com.myproject.android.ImageDownloaderThread.queueImage(ImageDownloaderThread.java:74)
    at com.myproject.android.NewsItemPagerActivity$NewsItemFragmentStatePagerAdapter.getItem(NewsItemPagerActivity.java:325)
    at android.support.v13.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:109)
    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:982)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
    at android.view.Choreographer.doFrame(Choreographer.java:544)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515) …
Run Code Online (Sandbox Code Playgroud)

android message-queue background-thread android-handlerthread android-looper

5
推荐指数
1
解决办法
2582
查看次数

从非UI线程更新视图

我对Android系统的工作方式感到困惑,尤其是在更新视图层次结构时。我们都知道,除了UI(Main)线程之外,我们不应从任何其他线程更新任何视图。当我们尝试这样做时,甚至Android系统也会引发异常。前几天,我试图在应用程序中实现显示视图的自定义进度。因此,我开始使用标准Java线程和处理程序组合。

当我能够从后台线程更新TextView时,我的发现使我感到惊讶。

new Thread(new Runnable() {

        @Override
        public void run() {
            mTextView.setText("I am " + Thread.currentThread().getName());
        }
    }).start();
Run Code Online (Sandbox Code Playgroud)

之后,我也尝试更新其他视图,效果很好。所以我尝试在后台线程中放置一个睡眠调用。

new Thread(new Runnable() {

        @Override
        public void run() {
            mTextView.setText("Thread : before sleep");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mTextView.setText("Thread : after sleep");
        }
    }).start();
Run Code Online (Sandbox Code Playgroud)

并按预期崩溃

android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触摸其视图。

然后,我尝试将setText()调用在sleep()调用之前和之后循环100次,1000次。当然,该应用程序每次都会崩溃,但我能够在textview上看到“睡眠前”文本。

所以我的问题是系统何时检测到某些非UI线程正在尝试更新视图当非UI线程中没有sleep()调用时为什么它不起作用

multithreading android textview background-thread android-view

5
推荐指数
1
解决办法
867
查看次数

需要帮助运行线程 SBCL

我正在 sbcl 上编写一些 lisp 代码,以便在守护进程模式下运行函数。问题是当我使用函数 sb-thred:make-thread 时,例如如下:

(sb-thread:make-thread (lambda () (progn (sleep 1) (when t (print "background action")))))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

Not supported in unithread builds. [Condition of type SIMPLE-ERROR]
Run Code Online (Sandbox Code Playgroud)

怎么了 ?... 感谢帮助。

sbcl common-lisp background-thread

4
推荐指数
1
解决办法
2469
查看次数