当前位置: 首页 > 面试题库 >

BlackBerry类是否等效于AsyncTask?

归松
2023-03-14
问题内容

我的要求是拥有一个线程,该线程可以维护BlackBerry设备与服务器之间的套接字连接并交换命令,类似于请求和响应。

我的问题是,我需要这个线程在后台运行 所有的时间
,并保持提供给用户的UI。因此,当服务器发出命令时,此线程将对其进行解析并更新UI,并且如果BlackBerry用户发出了操作,则该线程会将其发送到服务器,然后服务器将对其进行处理。

我在Android中使用开发了相同的应用程序,AsyncTask并且运行良好。但是在BlackBerry中,因为没有这样的类,所以我使用了invokeLater()选项。服务器与BB设备之间的通信正常,但是UI在BlackBerry上冻结。

任何人都知道如何正确解决这个问题吗?


问题答案:

Vishal处在正确的轨道上,但要与Android的版本相匹配还需要更多AsyncTask。由于BlackBerry上Java
1.3无法提供枚举和泛型,因此您无法完美匹配Android API。

但是,您可以执行以下操作(未经测试……这只是您的起点):

import net.rim.device.api.ui.UiApplication;

public abstract class AsyncTask {

    public static final int FINISHED = 0;
    public static final int PENDING = 1;
    public static final int RUNNING = 2;

    private int _status = PENDING;
    private boolean _cancelled = false;
    private Thread _worker;

    /** subclasses MUST implement this method */
    public abstract Object doInBackground(Object[] params);

    protected void onPreExecute() {
        // default implementation does nothing
    }
    protected void onPostExecute(Object result) {
        // default implementation does nothing
    }
    protected void onProgressUpdate(Object[] values) {
        // default implementation does nothing
    }
    protected void onCancelled() {
        // default implementation does nothing
    }
    protected void onCancelled(Object result) {
        onCancelled();
    }

    public final int getStatus() {
        return _status;
    }

    public final boolean isCancelled() {
        return _cancelled;
    }

    public final boolean cancel(boolean mayInterruptIfRunning) {
        if (_status == FINISHED || _cancelled) {
            return false;
        } else {
            _cancelled = true;
            if (mayInterruptIfRunning && _status == RUNNING) {
                // NOTE: calling Thread.interrupt() usually doesn't work
                //   well, unless you don't care what state the background
                //   processing is left in.  I'm not 100% sure that this is how
                //   Android's AsyncTask implements cancel(true), but I 
                //   normally just cancel background tasks by letting the
                //   doInBackground() method check isCancelled() at multiple
                //   points in its processing.
                _worker.interrupt();
            }
            return true;
        }
    }

    protected final void publishProgress(final Object[] values) {
        // call back onProgressUpdate on the UI thread
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                onProgressUpdate(values);
            }
        });
    }

    private void completeTask(final Object result) {
        // transmit the result back to the UI thread
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                if (isCancelled()) {
                    onCancelled(result);
                } else {
                    onPostExecute(result);
                }
                // TODO: not sure if status should be FINISHED before or after onPostExecute()
                _status = FINISHED;
            }
        }); 
    }

    public AsyncTask execute(final Object[] params) throws IllegalStateException {
        if (getStatus() != PENDING) {
            throw new IllegalStateException("An AsyncTask can only be executed once!");
        } else {
            try {
                onPreExecute();

                _worker = new Thread(new Runnable() {
                    public void run() {
                        try {
                            // run background work on this worker thread
                            final Object result = doInBackground(params);
                            completeTask(result);
                        } catch (Exception e) {
                            // I believe if Thread.interrupt() is called, we'll arrive here
                            completeTask(null);
                        }
                    }
                });
                _status = RUNNING;
                _worker.start();
            } catch (Exception e) {
                // TODO: handle this exception
            }
        }

        return this;
    }

}

另外,请务必牢记适用于上述实现的Android AsyncTask线程规则:

线程规则 为了使此类正常工作,必须遵循一些线程规则:

  • 必须在UI线程上加载AsyncTask类。从JELLY_BEAN开始,这是自动完成的。

  • 必须在UI线程上创建任务实例。

  • 必须在UI线程上调用execute(Params …)。

  • 不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params
    …),onProgressUpdate(Progress …)。

  • 该任务只能执行一次(如果尝试第二次执行,则将引发异常。)



 类似资料:
  • 问题内容: 我正在配置Java客户端,它的工作是建立与服务器的TLS连接。我想使用以下3种密码配置客户端: 在Java支持的密码套件中,我找到了相同的密码,但是开头是SSL,而不是TLS。问题是,如果我用以下方法配置了客户端: 这两个列表是否完全相同,并且服务器将对其进行解释?我担心是否为客户端配置了密码,这意味着与某些不同,并且可能某些服务器不支持。我如何确定? 问题答案: 是的,它们是相同的。

  • 问题内容: 我来自c#领域。 在C#中,我可以使用动态类http://msdn.microsoft.com/zh- cn/library/dd264741.aspx 这使我不必使用模板/泛型类,而可以针对certian情况获得类似的感觉。 不幸的是,“动态”和“ java”关键字在动态架构上出现了许多不相关的信息,因此我在互联网搜索中一直不成功。 我在javaFX中涉猎了一点,并且有一个var类型

  • 问题内容: 我在SceneDelegate中定义了一个let属性。我希望某些ViewController能够在场景中访问它。 在UIKit中,我可以这样访问App Delegate属性: 然后强制转换并指定属性名称… 是否有等效的方法可以从UIViewController的实例获取对视图控制器所在的SceneDelegate的引用? 问题答案: 从iOS 13开始,具有的属性。这些场景中的每一个都

  • 问题内容: 最近,我遇到了一些Java代码,这些代码简单地将一些字符串放入Java TreeSet中,为其实现了基于距离的比较器,然后在日落时分快乐地计算出给定的分数来解决给定的问题。 我的问题 是否有适用于Python的等效数据结构? Java树集看起来基本上是一个有序字典,可以使用某种比较器来实现这种排序。 我看到有一个用于 OrderedDict的Py3K的PEP,但是我使用的是2.6.x。

  • 问题内容: 我知道我们可以使用Java中的方法通过指定其位置来获取字符串中的单个字符。C#中有等效的方法吗? 问题答案: 您可以像数组一样索引C#中的字符串,然后在该索引处获取字符。 例: 在Java中,您会说 在C#中,您会说

  • 问题内容: 在预发布文档中,似乎没有Swift版本的CGPathApply。是否有同等的或替代的?我正在尝试获取CGPath的所有子路径,以便可以从其他起点重绘它。 问题答案: 斯威夫特3.0 在Swift 3.0中,您可以这样使用: 斯威夫特2.2 通过添加,您现在可以直接从Swift进行调用。这是做必要魔术的包装器: (请注意,我的代码中没有提到,但是在Core Graphics模块的声明中使