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

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 问题

报错如下

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,如下

<intent-filter>
	<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

还有一种原因可能是配置文件信息书写错误

<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

原始代码

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");
		}
	}
}

运行时会报错

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对象通知主线程。

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,同时,将原来的主活动文件添加到其下面:

<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;即可。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI码东道主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值