Rya*_*yan 47 java android asynchronous
我最近编写了我的第一个Android应用程序,大约有8,000-10,000行代码.连续阻碍我使用正常设计模式的一件事是android大量使用异步调用(打开对话框,活动等).因此,我的代码很快开始看起来像"意大利面条",我最终开始不喜欢看某些类.
有没有特定的设计模式或编程方法适用于任何人都会推荐的系统?有没有关于编写可管理的异步代码的建议?
Wro*_*lai 46
如果您不想通过简单的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>
Run Code Online (Sandbox Code Playgroud)
layout/main.xml:
现在,如果你有,那么,两个TextViews,它们都应该具有相同的行为,让它们使用这种TitleText风格.示例代码:
<!--- ... -->
<TextView
android:id="@+id/textview_one"
style="@style/TitleText"
/>
<TextView
android:id="@+id/textview_two"
style="@style/TitleText"
/>
<!--- ... -->
Run Code Online (Sandbox Code Playgroud)
简单,您不需要重复代码.如果您真的想进一步了解这个特定主题,请查看布局技巧:创建可重用的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...
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以在Activity需要将以下代码用于向服务器发送数据:
Tools.sendData("www.www.www", "user", "pass");
Run Code Online (Sandbox Code Playgroud)
但是,你明白了.在您需要的地方使用此"模式" ,它将使您免于弄乱您的代码.
这可能是最有用的一点.要仅定义" 用户需要与应用程序交互的位置 ",假设您有一个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);
}
Run Code Online (Sandbox Code Playgroud)
重新设计它是这样的:
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);
}
Run Code Online (Sandbox Code Playgroud)
例如,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.
}
}
Run Code Online (Sandbox Code Playgroud)
你知道这是怎么回事.您可以将此很多事情,例如onClick,onClickListener,onCreateOptionsMenu,名单很长.要了解更多"最佳做法",您可以在此处查看Google的一些示例应用程序.寻找他们如何以一种美好而正确的方式实现事物.
遗言; 保持代码清洁,以合理的方式命名变量和方法,尤其是以正确的方式.始终,始终了解您在代码中的位置 - 这非常重要.
从业余角度来看,我不认为我的第一次尝试是一个干净的,生产就绪的应用程序.我有时候会吃意大利面条,fettucini甚至是馄饨代码.那时,我试着从代码中重新思考我最不喜欢的东西,并寻找更好的选择:
我在异步方法中看到的最常见错误之一是在循环内使用静态变量来创建一个或多个线程,而不考虑该值可能在另一个线程中发生变化.避免静电!
正如OceanBlue指出的那样,由此可能并不清楚final static变量不会产生任何危险,而是可以改变的公共静态变量.静态本身不是问题,但是他们会有一个值,然后发现价值发生了变化.可能很难发现问题所在.典型的例子是点击计数器或计时器值,当可能有多个点击的视图或多个计时器时.
希望你会得到比我更多经验的人的建议.祝好运!
| 归档时间: |
|
| 查看次数: |
5619 次 |
| 最近记录: |