一、主题与样式
样式与主题: 主要是为了设置 app的显示效果
- 样式:
而这里的样式, 都是 在values文件夹下的 styles.xml文件中定义好的
image.png
-
主题:是用来设置 activity的显示风格 .
image.png
同样的, 在 styles 文件中又 有了 apptheme , 并且可以 继承.
image.png
二、国际化
应用程序中一些常见的字符、图片、类型值以及一些提示信息都应该符合当地的语言和阅读习惯,简称i18n。
三、网络连接相关(重要)
- 入门程序-网络图片查看器
a、 网络连接不能在主线程中运行,主线程中是不允许干耗时的事儿的,需要将连接网络的代码 放到 子线程中去做.
b、只有在创建 该 view对象 的 线程里才可以去 更新当前view 中的数据,只有在主线程中才可以去 修改UI界面
由于涉及到线程间通信, 而线程间通信又涉及到线程的互斥,唤醒... 等操作, 这个代码写起来非常的复杂,所以,谷歌工程师提供了handler , 我们只需要去使用一些就可以了. 事实上 这里 的handler 内部也是 通过线程互斥来实现的.
c、android中 还有 一套 保护机制
为了提高用户的感受, 如果一个 应用程序 干了某个耗时的事儿 ,但是这个耗时的事儿又没有被检测
出来, 并且 耗时也的确很长 , 那么这个时候, 系统就提供了另外的一套 保护机制.
如果长时间应用程序无任何响应 , 那么会报ANR (application not responding ), 应用程序无响应 .
在android 中不同的组件中 , ANR机制 生效的时间 也是不一样的 .
在activity 中, ANR生效的 时间 是 5 秒钟
在 service 中,ANR生效的 时间 是 10秒钟
d、网络图片查看器的代码:
public class MainActivity extends Activity {
private static final int SUCCESS = 0;
protected static fina int ERROR = 1;
EditText et_path;
ImageView iv_pic;
// 1、在主线程中创建handler的成员变量
@Override
protected void onCreate(Bundle savedInstanceqState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
// 初始化
et_path = (EditText) findViewById(R.id.et_path);
iv_pic = (ImageView) findViewById(R.id.iv_pic );
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what ) {
case SUCCESS :
Bitmap bitmap = (Bitmap) msg. obj;
iv_pic.setImageBitmap(bitmap);
break ;
case ERROR :
Toast. makeText(MainActivity.this, "对不起, 出错了. " , 0).show();
break;
default:
break;
}
};
};
String path;
public void select(View v) {
// 获取地制值
path = et_path .getText().toString().trim();
// 判断地址
if (TextUtils.isEmpty( path)) {
Toast. makeText(this, "地址栏不能为空" , 0).show();
return;
}
// 连接网络,需要开启一个子线程
new Thread() {
public void run() {
try{
// 1、创建URL对象,打开一个HTTP类型的连接
URL url = new URL(path );
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 2、设置请求方式GET、POST,连接的超时时间等请求参数
conn.setRequestMethod( "GET");
conn.setReadTimeout(3000);
// 3、得到服务器端返回的响应数据(以二进制流的形式返回响应数据),判断响应码是不是200请求成功、404找不到资源、503服务器端内部错误:
// 判断响应码是不是200
int code = conn.getResponseCode();
if (code == 200) {
// 4、把二进制流的响应数据转换成需要的数据类型:
InputStream in = conn.getInputStream();
// 这个流是 一个 图片的数据, 那么需要将 流 转换为 图片
Bitmap bitmap = BitmapFactory.decodeStream(in);
// 5、将图片数据放到ImageView中显示
// iv_pic.setImageBitmap(bitmap);
Message msg = Message.obtain();
msg. obj = bitmap;
// 成功
msg. what = SUCCESS ;
handler.sendMessage(msg);
}
} catch (Exception e) {
Message msg = Message.obtain();
msg. what = ERROR ;
handler.sendMessage(msg);
e.printStackTrace();
}
};
}.start();
}
}
四、解析xml文件(手机号码吉凶测试)
public class MainActivity extends Activity {
protected static final int SUCCESS = 0;
protected static final int ERROR = 1;
EditText et_number;
TextView tv_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
// 初始化
et_number = (EditText) findViewById(R.id.et_number);
tv_result = (TextView) findViewById(R.id.tv_result );
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what ) {
case SUCCESS :
Product value= (Product) msg. obj;
tv_result.setText(value.toString());
break;
case ERROR :
Toast. makeText(MainActivity.this, "对不起,程序出错了" , 0).show();
break;
default:
break;
}
};
};
public void ceshi(View v) {
String number = et_number.getText().toString().trim();
if (TextUtils.*isEmpty*(number)) {
Toast. makeTextthis, "对不起,手机号码不能为空" , 0).show();
return;
}
new Thread() {
public void run() {
try {
URL url = new URL("http://188.188.5.52:8080/phone.xml" );
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 设置连接超时
conn.setConnectTimeout(3000);
conn.setRequestMethod( "GET");
// 获取相应状态吗
int code = conn.getResponseCode();
if (code == 200) {
// 拿到数据
InputStream in = conn.getInputStream();
// 使用pull解析器解析
XmlPullParser parser = Xml.newPullParser();
// 设置输入流和编码机
parser.setInput(in, "UTF-8");
// 获取标签的类型
int type = parser.getEventType();
Product p = new Product();
while (type != XmlPullParser.END_DOCUMENT ) {
if (type == XmlPullParser.START_TAG ) {
if (parser.getName().equals("product" )) {
String ptype = parser.getAttributeValue(0);
p.setType(ptype);
} else if (parser.getName().equals("phonenum" )) {
String phonenum = parser.nextText();
p.setPhonenum(phonenum);
} else if (parser.getName().equals("location" )) {
String location = parser.nextText();
p.setLocation(location);
} else if (parser.getName().equals("phoneJx" )) {
String phoneJx = parser.nextText();
p.setPhoneJx(phoneJx);
}
}
type = parser.next();
}
// handler帮助完成线程间的通信
Message msg = Message.*obtain*();
msg. obj = p;
msg. what = *SUCCESS* ;
handler.sendMessageAtFrontOfQueue(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg. what = ERROR ;
handler.sendMessageAtFrontOfQueue(msg);
}
};
}.start();
}
}
五、解析Json文件
Json数据的两种格式 :
第一种: json 对象 ---- {key:value,key:value,key:value}
第二种: json 数组------- [value1,value2,value3,value4]
第三种: 混合的数组中包含了 对象
注:Json数据的key始终都是字符串,但value的值 比较随意。
天气预报案例:将in流数据转换成Json数据?
image.png
image.png
网友评论