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

异步编程最佳实践

壤驷茂实
2023-03-14
问题内容

我最近写了我的第一个Android应用程序,大约有8,000-10,000行代码。一直阻碍我使用常规设计模式的一件事是android对异步调用(打开对话框,活动等)的大量使用。因此,我的代码很快就开始看起来像“意大利面”,而我最终开始不喜欢某些类。

是否有适用于任何人都会推荐的系统的特定设计模式或编程方法?对于编写可管理的异步代码有什么建议吗?


问题答案:
  • 使用全局变量

如果您不想用简单的Intent.putExtra()调用弄乱代码并为每个唯一的代码管理这些事情,则Activity必须在应用程序中使用全局变量。Application只要应用程序处于活动状态,就可以扩展和存储所需的数据。要真正实现它,请使用此出色的答案。这将使活动之间的依赖关系消失。例如,假设您在应用程序的生命周期内需要为该应用程序提供一个“用户名”-这是一个很好的工具。无需打脏Intent.putExtra()电话。

  • 使用样式

制作第一个Android应用程序时,一个常见的错误是通常只是开始编写XML视图。XML文件将(没有问题且非常快速)最多包含多行代码。在这里,您可以找到一个解决方案,只需使用该style属性即可实现特定的行为。例如,考虑这段代码:

values / styles.xml

<style name="TitleText">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">#000</item>
    <item name="android:textStyle">bold</item>   
</style>

layout / main.xml

现在,假设您有两个,TextView并且两个都应具有相同的行为,则使它们使用TitleText样式。样例代码:

<!--- ... -->
<TextView
   android:id="@+id/textview_one"
   style="@style/TitleText" 
/>

<TextView
   android:id="@+id/textview_two" 
   style="@style/TitleText" 
/>
<!--- ... -->

很简单,您不需要重复代码。如果您真的想进一步研究这个特定主题,请参阅布局技巧:创建可重用的UI组件。

这一点很简短,但我认为必须提及。开发人员可能会犯的另一个错误是跳过 strings.xml
,只在代码中(他需要的地方)编写UI消息(和属性名称)。使您的应用程序易于维护;只需在 strings.xml 文件中定义消息和属性。

  • 创建和使用全局工具类

当我编写第一个应用程序时,我只是在需要的地方编写(并重复了)方法。结果?许多在各种活动之间具有相同行为的方法。我学到的是制作工具类。例如,假设您必须在所有活动中发出Web请求。在这种情况下,请跳过在实际中定义它们的步骤,Activity并为其创建一个静态方法。样例代码:

public final class Tools {

    private Tools() {
    }

    public static final void sendData(String url, 
              String user, String pass) {
        // URLConnections, HttpClients, etc...
    }

}

现在,您只需在Activity需要向服务器发送数据的代码中使用以下代码即可:

Tools.sendData("www.www.www", "user", "pass");

但是,您明白了。 在需要的地方 使用此“模式” ,它可以防止您弄乱代码。

  • 让自定义类定义用户需要与应用程序进行交互的行为

这可能是最有用的一点。要仅定义“ 用户需要与应用程序进行交互的位置
”,假设您有一个Menu,它的行为在行数方面非常长,为什么我们将Menu的计算保留在同一类中?每一个小项都会使您的Activity课程变得更痛苦,因为您的代码看起来像“意大利面条”。例如,不要像这样:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem item;
    item = menu.findItem(R.id.menu_id_one);
    if (aBooleanVariable) {
        item.setEnabled(true);
    } else {
        item.setEnabled(false);
    }
    // More code...
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem i) {
    // Code, calculations...
    // ...
    // ...
    return super.onOptionsItemSelected(i);
}

重新设计为这样的东西:

private MyCustomMenuInstance mMenuInstance;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    setContentView(R.layout.main);

    mMenuInstance = new MyCustomMenuInstance();
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    mMenuInstance.onPrepareOptionsMenu(menu);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem i) {
    mMenuInstance.onOptionsItemSelected(i);
    return super.onOptionsItemSelected(i);
}

例如MyCustomMenuInstance

public class MyCustomMenuInstance {

    // Member fields..

    public MyCustomMenuInstance() {
        // Init stuff.
    }

    public void onPrepareOptionsMenu(Menu menu) {
        // Do things..
        // Maybe you want to modify a variable in the Activity 
        // class? Well, pass an instance as an argument and create
        // a method for it in your Activity class.
    }

    public void onOptionsItemSelected(MenuItem i) {
        // Do things..
        // Maybe you want to modify a variable in the Activity 
        // class? Well, pass an instance as an argument and create
        // a method for it in your Activity class.
    }

}

您会看到前进的方向。您可以将此很多事情,例如onClickonClickListeneronCreateOptionsMenu,名单很长。要了解更多“最佳做法”,您可以在此处查看来自Google的一些示例应用程序。寻找他们如何以一种不错且正确的方式实现事物。

遗言; 保持代码干净,以逻辑方式(尤其是正确方式)命名变量和方法。始终要始终了解您在代码中的位置-这非常重要。



 类似资料:
  • 每个程序员都希望他们的程序在质量和效率方面是最好的。 以下是编写Rexx程序时可以帮助实现这些目标的一些最佳编程实践或提示。 Hint 1 在向操作系统或命令提示符发出任何命令之前,请使用address命令。 这将帮助您事先在内存中获取地址空间,从而使您的程序更有效地运行。 地址命令的示例如下所示。 例子 (Example) /* Main program */ address system d

  • 场景:我需要从web应用程序的API收集分页数据,该API的调用限制为每分钟100次。我需要返回的API对象每页包含100个项目,总共105个页面,并且在不断增长(~10500个项目)。同步代码检索所有页面大约需要15分钟,因此不必担心达到调用限制。但是,我想加快数据检索速度,因此我使用和实现了异步调用。数据现在可以在15秒内下载-很好。 问题:我现在达到呼叫限制,因此在过去的5个左右的呼叫中收到

  • 介绍 Javascript 是一个单线程的编程语言,单线程的特点就是一次只能处理一件事情,当前代码任务耗时执行会阻塞后续代码的执行。异步编程则是一种事件驱动编程,请求调用函数或方法后,无需立即等待响应,可以继续执行其他任务,而之前任务响应返回后可以通过状态、通知和回调来通知调用者。 异步编程方法 js 中的异步编程方法有回调函数、事件处理函数、观察者、Promise、Generator、async

  • NodeJS最大的卖点——事件机制和异步IO,对开发者并不是透明的。开发者需要按异步方式编写代码才用得上这个卖点,而这一点也遭到了一些 NodeJS反对者的抨击。但不管怎样,异步编程确实是NodeJS最大的特点,没有掌握异步编程就不能说是真正学会了NodeJS。本章将介绍与异步编 程相关的各种知识。 回调 在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异

  • 目前为止,我们在做的都是同步编程。同步编程执行过程很简单:一个程序从第一行开始,逐行执行一直到末尾。每次调用一个函数时,程序就会等待这个函数返回然后在执行下一行。 在异步编程中,函数地执行通常是非阻塞的。换句话说,每次你调用一个函数它就会立即返回,但相对得,这就表示函数并不会立即被执行。它有了一种机制(名为 调度程序),让可以随时在未来执行这些函数。 使用异步编程会导致程序在任何异步函数开始之前就

  • 我基本上有一个对象,它存储了一个项目的3D位置和其他属性,如速度。该位置每隔100毫秒由一个单独的威胁计算一次。另一种威胁访问这些属性并修改其中的一些属性。 我的第一个想法是简单地对每个属性使用,但据我所知,对volatile属性的每个操作都必须是原子的。由于这两种威胁都允许在某些情况下改变某些属性(如速度),这似乎不起作用。 我的下一个想法是使用Java的关键字,同步每个getter和sette