at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 3 more
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
-
N个进程,N个独立的虚拟机,Application被N次初使化
-
处理时应该在Application中分进程初始化数据
多进程的不足与缺点
1.数据共享问题
a. 由于处于不同的进程导致了数据无法共享内容,无论是static变量还是单例模式的实现。
b.SharedPreferences 还没有增加对多进程的支持。
c.跨进程共享数据可以通过Intent,Messenger,AIDL等。
2. SQLite容易被锁
a.由于每个进程可能会使用各自的SQLOpenHelper实例,如果两个进程同时对数据库操作,则会发生SQLiteDatabaseLockedException等异常。
解决方法:可以使用ContentProvider来实现或者使用其他存储方式。
3. 不必要的初始化
多进程之后,每个进程在创建的时候,都会执行自己的Application.onCreate方法。
通常情况下,onCreate中包含了我们很多业务相关的初始化,更重要的这其中没有做按照进程按需初始化,即每个进程都会执行全部的初始化。
按需初始化需要根据当前进程名称,进行最小需要的业务初始化。
按需初始化可以选择简单的if else判断,也可以结合工厂模式
所以判断该空指针是由于多进程导致的在application中初始化了多次,从而当非主进程被销毁后,其中的context也随之被销毁了或者多进程调用SharedPreferences
android应用在被启动时,对应的进程的进程名一般就是包名。android应用一般是运行在自己的进程中,除非通过AndroidManifest.xml中application定义中通过android:process字段指定运行在其他进程中(这种机制有特殊限定条件)。
判断当前进程是否是 APP 默认进程,只在主进程中进行初始化操作, APP 默认进程名就是包名。
private final static String PROCESS_NAME = "com.xx.yy.ccc";
* 判断是不是UI主进程,因为有些东西只能在UI主进程初始化
public static boolean isAppMainProcess() {
try {
int pid = android.os.Process.myPid();
String process = getAppNameByPID(MyApplication.getApplication(), pid);
if (TextUtils.isEmpty(process)) {
return true;
} else if (PROCESS_NAME.equalsIgnoreCase(process)) {
return true;
} else {
return false;
} catch (Exception e) {
e.printStackTrace();
return true;
* 根据Pid得到进程名
public static String getAppNameByPID(Context context, int pid) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (android.app.ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid) {
return processInfo.processName;
return "";
http://www.jb51.net/article/104173.htm
http://blog.csdn.net/wei1583812/article/details/53395234
http://blog.csdn.net/renkangker/article/details/46888885
http://blog.csdn.net/zhanglianyu00/article/details/51793857
at java.util.concurrent.FutureTask.run(FutureTask.java:237) ... 3 morejava.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Conte...
在使用自己定义的Application中初始化Sharepreferences总是提示空指针异常
package com.xinzhi.zhouzhi.model.prefs;
import android.content.Context;
import android.content.SharedPre...
这几天写Service组件的时候,莫名其妙老出现NullPointerException异常,主要经过是这样的:在Activity中创建Preferences文件,然后在Service中使用这个文件,出错的源代码如下:
1 import android.app.Service; 2 import android.content.Intent; 3 import android.cont...
android的报错提示:
java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)’ on a null object reference
在Andr
异常信息:
java.lang.RuntimeException: Unable to start activity ComponentInfo{***.MainActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.co...
问题背景:在没有网络的情况下调试4个插页的导航栏的时候,多次快速的来回切换插页,就会崩溃,定位日志发现:
Toast.makeText(getActivity(), "当前无网络", Toast.LENGTH_LONG).show();
这个context出了问题,后来查阅资料,大概的意思就是,当前这个界面已经被延迟执行了,再想getactivity()是不行了,所以要加一个判断“isadd(...
今天写了一个小程序,在Activity定义SharedPreferences的时候做了初始化,结果一直报NullPoint空指针异常。
后来找了一下原因,发现初始化sp需要依托context,而此时context还没有创建出来。
为了保证context的存在,应该把sp的初始化放在Activity的初始化之后,这样就不会再报空指针的异常了。
android https 证书报错 CertPathValidatorException: Trust anchor for certification path not found