*(面试题)什么是ANR?怎么避免ANR才出现
* 答:1、android在高版本加入了自检逻辑,检测应用程序里面的网络交互逻辑是否是
* 在主线程里面执行的,如果是,则抛出以上异常。低版本是没有这个检测逻辑的。
* 2、为什么在主线程休眠一会,就会抛出ANR呢?
* 因为android赋予程序主线程极大的权利,他是一个非常重要的工作,就是去更新UI,
* 或者刷新界面的显示。它必须时刻等待,警惕用户接下来要与界面的交互工作。如果
* 主线程执行一个事情耗费非常多的时间,就会抛出ANR。
* (面试题)什么是消息处理机制,
* 答:handle就是消息处理器,主要是非主线程中的数据或信息更新到主线程中去,然后显示在UI界面上。
*handler的步骤:
* 1、定义消息处理器:
*
布局是一个button和EditView、ImageView很简单这里不再列出。
* 答:1、android在高版本加入了自检逻辑,检测应用程序里面的网络交互逻辑是否是
* 在主线程里面执行的,如果是,则抛出以上异常。低版本是没有这个检测逻辑的。
* 2、为什么在主线程休眠一会,就会抛出ANR呢?
* 因为android赋予程序主线程极大的权利,他是一个非常重要的工作,就是去更新UI,
* 或者刷新界面的显示。它必须时刻等待,警惕用户接下来要与界面的交互工作。如果
* 主线程执行一个事情耗费非常多的时间,就会抛出ANR。
* (面试题)什么是消息处理机制,
* 答:handle就是消息处理器,主要是非主线程中的数据或信息更新到主线程中去,然后显示在UI界面上。
*handler的步骤:
* 1、定义消息处理器:
*
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
};
2、在线程中发送消息,如果有多个发送地方,应该以what标记
Message msg = Message.obtain();
msg.what = 2;
msg.obj = "图片访问失败,请检查网络";
handler.sendMessage(msg);
3、在handler里面处理消息
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Bitmap bitmap = (Bitmap)msg.obj;
mImage.setImageBitmap(bitmap);
break;
case 2:
String info = (String)msg.obj;
Toast.makeText(MainActivity.this,info,Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
网络获取图片:
<pre name="code" class="java">package lzl.edu.com.clientdemo;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends Activity {
private Button mSelect;
private EditText mPath;
private ImageView mImage;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Bitmap bitmap = (Bitmap)msg.obj;
mImage.setImageBitmap(bitmap);
break;
case 2:
String info = (String)msg.obj;
Toast.makeText(MainActivity.this,info,Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSelect = (Button)findViewById(R.id.select);
mPath = (EditText)findViewById(R.id.path);
mImage=(ImageView)findViewById(R.id.image);
mSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String path = mPath.getText().toString().trim();
Log.i("图片的资源路径:",path);
Log.i("ruesult:",TextUtils.isEmpty(path)+"");
if(!TextUtils.isEmpty(path)){
new Thread(){
@Override
public void run() {
super.run();
Bitmap bitmap = getImageFromServer(path);
Message msg = new Message();
msg.what = 1;
msg.obj = bitmap;
handler.sendMessage(msg);
}
}.start();
}
}
});
}
/**
* 获得网络上的图片
* 直接在主线程中请求网络会出现netWorkOnMainThreadException错误。
* @param path
* @return
*/
private Bitmap getImageFromServer(String path){
try {
//1、获得统一资源定位符
URL url = new URL(path);
//2、装化成http网络请求
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET"); //默认是get请求,当写POST时便是post请求
connection.setConnectTimeout(5000); //设置访问超时的时间。
if(200==connection.getResponseCode()){ //获取响应码
//获取资源类型
String type = connection.getContentType();
//获取资源的长度
int length = connection.getContentLength();
Log.i("图片的资源:","type==="+type+"length==="+length);
//3、获取网络输入流
InputStream is = connection.getInputStream();
//4、将流转换成bitmap对象
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
}
}catch (Exception e){
Message msg = Message.obtain();
msg.what = 2;
msg.obj = "图片访问失败,请检查网络";
handler.sendMessage(msg);
}
return null;
}
}
布局是一个button和EditView、ImageView很简单这里不再列出。