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下文件夹的资源,如果只在一个文件下放了资源文件,不同的分辨率设备的会报错。
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的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环。
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;
即可。