您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
50_如何避免掉程序出现anr异常(应用程序未响应)
发布时间:2021-03-01 11:29:49编辑:雪饮阅读()
回顾前面的关于网络请求的项目,比如获取一个网络地址的html源码这个项目,那么当填写一个访问超慢,甚至最后都访问不到的比如google.com时候,不等“查看”的内容返回时就不断的再次点击“查看”,这就可能造成如下错误,导致程序未响应错误。
这是因为这个项目的网络访问及返回内容到ui全部是在主线程中实现的,那么上一篇中我们有用到消息机制,那么通过子线程去网络访问等响应结果回来后再进行消息通知给主线程,主线程读取到消息队列中的消息后再进行处理。
这样一来就避免了主线程最后出现应用程序未响应的错误。据说主线程在线程等待超过6秒就会导致未响应错误。
另外这种新的处理方式在网络请求时还可以省下一些代码,比如之前用的:
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi")
@SuppressLint("NewApi")
还有
StrictMode.setThreadPolicy(policy);
那么这次对这个htmlview项目用这个新的处理方式进行改造下,则MainActivity.java:
package com.example.htmlview;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText mEtAddress;
private Button mBtView;
private TextView mTvView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtView = this.findViewById(R.id.bt_view);
mEtAddress = this.findViewById(R.id.et_address);
mTvView = this.findViewById(R.id.tv_content);
mBtView.setOnClickListener(this);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
mTvView.setText(msg.obj.toString());
}
if(msg.what==0){
Toast.makeText(MainActivity.this,msg.obj.toString(), Toast.LENGTH_SHORT).show();
}
super.handleMessage(msg);
}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_view:
//按钮对应的点击事件
String address = mEtAddress.getText().toString().trim();
if("".equals(address)){
Toast.makeText(this, "地址不能为空", Toast.LENGTH_SHORT).show();
return;
}
new Thread() {
@Override
public void run() {
super.run();
try {
String html = NetUtil.getHtml(address);
Message msg = new Message();
//多个消息可以设置message.what
msg.what=1;
msg.obj=html;
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
Message msg = new Message();
msg.what=0;
msg.obj="获取数据失败";
handler.sendMessage(msg);
}
}
}.start();
break;
}
}
}
这样一来那么无论你手速多快都不会出现应用程序未响应的错误了。
关键字词:android,anr,未响应
下一篇:51_隐式意图和显示意图