本文转载了别人的一个帖子:
现在市面上大容量存储卡(大于4G的)有两种,一种是普通卡(不带SDHC标志的,不带Class2、Class4、Class6标志的,一般容量小于8G),一种是SDHC的高速卡,包括8G、16G以及快要进入民用的32G卡。对于普通卡一般读取速度少于8M/S,用这样的卡在手机上必然因为硬件的天生原因导致手机变慢,而SDHC高速卡的读取速度能达到15M/S以上,不论是在电脑上还是在手机上都有上佳的表现。以我的N82为例,以前用原装2G卡时进入多媒体看照片常常会出现图片读取迟滞的现象(先出现一个白色的图标,然后才慢慢出现真正的图片),而换用8G高速卡后这一现象并未出现!图片放大缩小的编辑、以及手机电影的播放速度都有明显提升!用低速卡读取迟滞的原因就是低速卡本身读取速度限制了数据处理,进而导致N82比较强大的处理不能展示其真正效能,如同你用QX6700的CPU却用老掉牙的IDE硬盘的道理一样!!并且更重要的是,由于SDHC标准的先进之处,符合其规格的数据卡用电量反而比那些普通的小容量卡低!这一点对手机更重要!
市面上能买得到的16G卡一般来说都是高速卡(低速卡做不到这么大了,技术限制),而N82本身带有SDHC控制器,理论上完全兼容16G高速卡的!只要在买卡的时候认准SDHC标志,或Class2、Class4、Class6标志(一个大“C”里面带有“2”“4”或“6”的标志)的,就可以放心使用!
那些说什么会用大容量卡会变慢的机友是想当然的下结论了……
备注:
手机标配SDK Card大小为2G TF Card,读写速度为8.8M/S左右,4G以上 TF/SD 普通卡的读写速度一般小于7M/S,如果用户需要4G以上的存储卡,建议买带有SDHC(高速卡,读取速度在15M/S-20M/S之间)标志的存储卡,这样就不会使手机变慢。
public class SoftwarePassionView extends ListActivity{
private ProgressDialog m_ProgressDialog = null;
private ArrayList<Order> m_orders = null;
private OrderAdapter m_adapter;
private Runnable viewOrders;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
m_orders = new ArrayList<Order>();
this.m_adapter = new OrderAdapter(this, R.layout.row, m_orders);
setListAdapter(this.m_adapter);
viewOrders = new Runnable(){
@Override
public void run() {
getOrders();
}
};
Thread thread = new Thread(null, viewOrders, "MagentoBackground");
thread.start();
m_ProgressDialog = ProgressDialog.show(SoftwarePassionView.this,
"Please wait...", "Retrieving data ...", true);
}
private Runnable returnRes = new Runnable() {
@Override
public void run() {
if(m_orders != null && m_orders.size() > 0){
m_adapter.notifyDataSetChanged();
for(int i=0;i<m_orders.size();i++)
m_adapter.add(m_orders.get(i));
}
m_ProgressDialog.dismiss();
m_adapter.notifyDataSetChanged();
}
};
private void getOrders(){
try{
m_orders = new ArrayList<Order>();
Order o1 = new Order();
o1.setOrderName("SF services");
o1.setOrderStatus("Pending");
Order o2 = new Order();
o2.setOrderName("SF Advertisement");
o2.setOrderStatus("Completed");
m_orders.add(o1);
m_orders.add(o2);
Thread.sleep(5000);
Log.i("ARRAY", ""+ m_orders.size());
} catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
runOnUiThread(returnRes);
}
private class OrderAdapter extends ArrayAdapter<Order> {
private ArrayList<Order> items;
public OrderAdapter(Context context, int textViewResourceId, ArrayList<Order> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
Order o = items.get(position);
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.toptext);
TextView bt = (TextView) v.findViewById(R.id.bottomtext);
if (tt != null) {
tt.setText("Name: "+o.getOrderName()); }
if(bt != null){
bt.setText("Status: "+ o.getOrderStatus());
}
}
return v;
}
}
}
2.row.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="6dip"
android:src="/blog_article/@drawable/icon/index.html" />
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:id="@+id/toptext"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center_vertical"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:id="@+id/bottomtext"
android:singleLine="true"
android:ellipsize="marquee"
/>
</LinearLayout>
</LinearLayout>
3
string.xml
<resources>
<string name="hello">Hello World, SoftwarePassionView!</string>
<string name="app_name">Software Passion</string>
<string name="main_no_items">No orders to display</string>
</resources>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<TextView
android:id="@+id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/main_no_items"/>
</LinearLayout>
不同Activity之间的数据传递
Bundle对象的实现
范例说明
在上一个范例里,介绍了如何在Activity中调用另一个Activity,但若需要在调用另外一个Activity的同时传递数据,那么就需要 利用android.os.Bundle对象封装数据的能力,将欲传递的数据或参数,通过Bundle来传递不同Intent之间的数据。
本范例的设计为一个简易表单的范例,在Activity1中收集User输入的数据,在离开Activity1的同时,将User选择的结果传递至下一个Activity2,以一个简单BMI"标准体重计算器"示范如何传递数据到下一个Activity里。
运行结果
(点击查看大图)图3-10 在两个Activity间做数据的传递
范例程序
src/irdc.ex03_10/EX03_10.java
在第一个Activity1主程序中,定义了"性别"选项的RadioGroup以及输入身高 的"EditText",并运用Intent及Bundle对象,在调用Activity2(EX03_10_1)时,同时将数据传入。关于 EditText对象的使用在此仅供参考,详细的应用以及属性方法,将会在未来讨论控件时,再详细解说。
package irdc.ex03_10; /* import相关class */ import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; public class EX03_10 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 载入main.xml Layout */ setContentView(R.layout.main); /* 以findViewById()取得Button对象,并添加onClickListener */ Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { /*取得输入的身高*/ EditText et = (EditText) findViewById(R.id.height); double height=Double.parseDouble(et.getText().toString()); /*取得选择的性别*/ String sex=""; RadioButton rb1 = (RadioButton) findViewById(R.id.sex1); if(rb1.isChecked()) { sex="M"; } else { sex="F"; } /*new一个Intent对象,并指定class*/ Intent intent = new Intent(); intent.setClass(EX03_10.this,EX03_10_1.class); /*new一个Bundle对象,并将要传递的数据传入*/ Bundle bundle = new Bundle(); bundle.putDouble("height",height); bundle.putString("sex",sex); /*将Bundle对象assign给Intent*/ intent.putExtras(bundle); /*调用Activity EX03_10_1*/ startActivity(intent); } }); } }
src/irdc.ex03_10/EX03_10_1.java
那么,在Activity2(EX03_10_1)要如何接收来自Activity1(EX03_10)传递来的数据呢?试想,在 Activity1是以Bundle封装对象,自然在Activity2亦是以Bundle的方式解开封装的数据;程序中以 getIntent().getExtras() 方法取得随着Bundle对象传递过来的性别与身高,经过计算之后,显示在屏幕上。
package irdc.ex03_10; /* import相关class */ import java.text.DecimalFormat; import java.text.NumberFormat; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class EX03_10_1 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 加载main.xml Layout */ setContentView(R.layout.myalyout); /* 取得Intent中的Bundle对象 */ Bundle bunde = this.getIntent().getExtras(); /* 取得Bundle对象中的数据 */ String sex = bunde.getString("sex"); double height = bunde.getDouble("height"); /* 判断性别 */ String sexText=""; if(sex.equals("M")) { sexText="男性"; } else { sexText="女性"; } /* 取得标准体重 */ String weight=this.getWeight(sex, height); /* 设置输出文字 */ TextView tv1=(TextView) findViewById(R.id.text1); tv1.setText("你是一位"+sexText+"\n你的身高是" +height+"厘米\n你的标准体重是"+weight+"公斤"); } /* 四舍五入的method */ private String format(double num) { NumberFormat formatter = new DecimalFormat("0.00"); String s=formatter.format(num); return s; } /* 以findViewById()取得Button对象,并添加onClickListener */ private String getWeight(String sex,double height) { String weight=""; if(sex.equals("M")) { weight=format((height-80)*0.7); } else { weight=format((height-70)*0.6); } return weight; } }
res/layout/mylayout.xml
mylayout.xml为(EX03_10_1)的Layout,定义了显示计算结果的TextView。
<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:layout_x="50px" android:layout_y="72px" > </TextView> </AbsoluteLayout>
AndroidManifest.xml
由于本范例中有两个Activity,所以文件中必须有两个activity的声明,否则系统将无法运行,请看以下的描述。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="irdc.ex03_10" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".EX03_10" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="EX03_10_1"></activity> </application> </manifest>
扩展学习
Bundle对象针对了不同的数据类型提供了许多的方法,例如,此范例中传递String类型的数据,使用的方法为Bundle.putString(stringName,stringValue):
bundle.putDouble("sex",sex);
而要传递Double类型的数据,使用的方法为Bundle.putDouble(doubleName,doubleValue),如下:
bundle.putString("height",height);
反之,若要由Bundle对象中取出数据,则使用Bundle.getString(stringName)、Bundle.getDouble(doubleName) 等相对应的方法即可。
除了上述简单的传递类型之外,尚有String[] 与ArrayList<String> 等封装的方式可供使用
参考。
来源:http://hi.baidu.com/lfcaolibin/blog/item/1e29f7546d7328cfb745aef5.html