前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(二)

Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(二)

作者头像
cutercorley
发布2020-07-23 15:58:08
1.6K0
发布2020-07-23 15:58:08
举报

文章目录

  • 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.htmlhttps://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;即可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 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)
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档