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

2020-07-23 15:58:08 浏览数 (1)

文章目录

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

0 人点赞