java - 是否有用于 java 的 Backgroundworker(例如在 .Net 中)

标签 java android

Backgroundworker 使进程在后台运行而不会使应用程序滞后,我们将感谢您提供任何有关它的信息。

最佳答案

对于 Android 应用程序使用 AsyncTask

http://developer.android.com/reference/android/os/AsyncTask.html

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

对于 Java swing 应用程序

对于 java swing 应用程序,使用 java.util.concurrent.ExecutorServicejavax.swing.SwingWorker

取决于你想做什么: 如果您使用的是 SwingWorker,则在 doInBackground 方法完成后,将在事件调度线程上执行 done 方法。如果您使用 ExecutorService,您必须注意与 ui 相关的工作是在事件调度线程上完成的。例如。使用 SwingUtilities.invokeLater

ExecutorService 来自 javadoc 的示例

class NetworkService implements Runnable {
   private final ServerSocket serverSocket;
   private final ExecutorService pool;

   public NetworkService(int port, int poolSize)
       throws IOException {
     serverSocket = new ServerSocket(port);
     pool = Executors.newFixedThreadPool(poolSize);
   }

   public void run() { // run the service
     try {
       for (;;) {
         pool.execute(new Handler(serverSocket.accept())); 
       }
     } catch (IOException ex) {
       pool.shutdown();
     }
   }
 }

 class Handler implements Runnable {
   private final Socket socket;
   Handler(Socket socket) { this.socket = socket; }
   public void run() {
     // read and service request on socket
   }
 }

SwingWorker来自 swing 教程的示例

SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {
    @Override
    public ImageIcon[] doInBackground() {
        final ImageIcon[] innerImgs = new ImageIcon[nimgs];
        for (int i = 0; i < nimgs; i++) {
            innerImgs[i] = loadImage(i+1);
        }
        return innerImgs;
    }

    @Override
    public void done() {
        //Remove the "Loading images" label.
        animator.removeAll();
        loopslot = -1;
        try {
            imgs = get();
        } catch (InterruptedException ignore) {}
        catch (java.util.concurrent.ExecutionException e) {
            String why = null;
            Throwable cause = e.getCause();
            if (cause != null) {
                why = cause.getMessage();
            } else {
                why = e.getMessage();
            }
            System.err.println("Error retrieving file: " + why);
        }

关于java - 是否有用于 java 的 Backgroundworker(例如在 .Net 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17229113/

相关文章:

Java 抽象类 : protected fields or public set/get methods

java - 检查设备是否有SIM模块

java - 图像适配器无法初始化 ImageView

android - 在android中从第三个 fragment 返回到第一个 fragment

java - 通过投影根据 child 的属性(property)获取 child 的数量

java - 使用正则表达式和java从聊天日志中获取一组数据

android - 在 Android 应用程序中设置初始焦点

android - 在 android 中使用 smack 4.1 获取在线用户(花名册条目)

Android:任务 ":app:dexDebug"执行失败

android - 如何使用 Android Volley 多部分数据