文章目录
- 1.Glide:You must pass in a non null View
- 2.Android studio项目崩溃报Binary XML file line #2: Error inflating class类错误
- 3.android.content.ActivityNotFoundException: No Activity found to handle Intent 问题
- 4.使用Android中的消息机制解决:Only the original thread that created a view hierarchy can touch its views
- 5.为APP设置启动欢迎界面,AndroidStudio添加启动界面之后闪退
- 6.Handler.SendMessage()——Cannot resolve method 'sendMessage(android.os.Message)
1.Glide:You must pass in a non null View
在自定义Dialog的时候,用Glide加载图片时报了一下异常 Caused by: java.lang.IllegalArgumentException: You must pass in a non null View 原因是Dialog还未显示出来,而ImageView为null,所以报了这个异常 解决的方法是先把Dialog显示出来,mDialog.show();在去用Glide加载图片。
2.Android studio项目崩溃报Binary XML file line #2: Error inflating class类错误
可能的原因:找不到资源文件: 系统会根据分辨率来选择加载不同drawable下文件夹的资源,如果只在一个文件下放了资源文件,不同的分辨率设备的会报错。 具体可参考https://www.cnblogs.com/awkflf11/p/5362927.html和https://www.cnblogs.com/longmaoxiansheng/p/9420619.html
3.android.content.ActivityNotFoundException: No Activity found to handle Intent 问题
报错如下
代码语言:javascript复制android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW cat=[android.intent.category.DEFAULT] dat=content://***.fileProvider/files_root/Android/data/***/cache/ofddata/5bd4483f46db4ea58fe3e7a0cb387cf8.ofd typ=application/ofd flg=0x10000003 }
这是因为在配置文件AndroidManifest.xml里面没有写新的activity的配置信息, 解决办法: 在AndroidManifest.xml中的相关活动acitivity添加intent-filter,如下
代码语言:javascript复制<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
还有一种原因可能是配置文件信息书写错误
代码语言:javascript复制<activity
android:name="com.example.message.Message"
android:label="@string/title_activity_message_web"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
如上,可能是label属性的文件名与实际不符,应该格外小心。
4.使用Android中的消息机制解决:Only the original thread that created a view hierarchy can touch its views
原始代码
代码语言:javascript复制public class MainActivity extends Activity implements View.OnClickListener {
private TextView stateText;
private Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
stateText = (TextView) findViewById(R.id.tv);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
new WorkThread().start();
}
//工作线程
private class WorkThread extends Thread {
@Override
public void run() {
//......处理比较耗时的操作
//处理完成后改变状态
stateText.setText("completed");
}
}
}
运行时会报错
代码语言:javascript复制ERROR/AndroidRuntime(421): FATAL EXCEPTION: Thread-8
ERROR/AndroidRuntime(421): android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
原因在于,Android系统中的视图组件并不是线程安全的,如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新的操作。 解决办法:在子线程中通知主线程,让主线程做更新操作,并使用Handler对象通知主线程。
代码语言:javascript复制public class MainActivity extends Activity implements View.OnClickListener {
private static final int COMPLETED = 0;
private TextView stateText;
private Button btn;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == COMPLETED) {
stateText.setText("completed");
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
stateText = (TextView) findViewById(R.id.tv);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
new WorkThread().start();
}
//工作线程
private class WorkThread extends Thread {
@Override
public void run() {
//......处理比较耗时的操作
//处理完成后给handler发送消息
Message msg = new Message();
msg.what = COMPLETED;
handler.sendMessage(msg);
}
}
}
通过上面这种方式,我们就可以解决线程安全的问题,把复杂的任务处理工作交给子线程去完成,然后子线程通过handler对象告知主线程,由主线程更新视图,这个过程中消息机制起着重要的作用。 ※Android通过Looper、Handler来实现消息循环机制。Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环。 关于消息机制的更多分析可参考https://blog.csdn.net/mars2639/article/details/6625165#。
5.为APP设置启动欢迎界面,AndroidStudio添加启动界面之后闪退
解决办法: 将启动的第一个页面设置为XXXActivity,同时,将原来的主活动文件添加到其下面:
代码语言:javascript复制<activity android:name=".XXXActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity">
</activity>
更改之后即可正常运行。
6.Handler.SendMessage()——Cannot resolve method 'sendMessage(android.os.Message)
原因:导入错误的包;-
解决:将import java.util.logging.Handler;
改为import android.os.Handler;
即可。