0
如果程序第一次启动,那么高速缓存中没有数据,所以数据必须从服务器下载(使用asyncTask)并保存到文件。从文件中读取问题
public static String filename = "channels.txt";
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = openFileOutput(filename, Context.MODE_APPEND);
out = new ObjectOutputStream(fos);
out.writeObject(ChannelManager.mInstance);
out.close();
fos.close();
}
主要思想是我序列化对象并将其写入文件供以后使用。
然后我尝试阅读:
FileInputStream fis = null;
ObjectInputStream in = null;
try {
fis = openFileInput(filename);
in = new ObjectInputStream(fis);
mChannelManager = (ChannelManager) in.readObject();
Log.e("mChannelManager", mChannelManager.getChannel_list().get(3) + "");
in.close();
fis.close();
}
,如果我尝试读它,它已经写到文件后,它工作正常,但如果我关闭或杀死的应用程序,并尝试从文件中读取,我得到空指针异常:/
我试图保存的文件名到共享的喜好和使用它,但还是得到了空指针异常(认为它是字符串/对象/内存引用问题)
那么,是(或可能)的问题?
错误日志:
10-07 10:54:15.773 10630-10647/? E/CMC->NioClient3﹕ NioClient thread get exception e: I/O exception while read message:
10-07 10:54:30.123 10741-10741/? E/APKInstallReceiver﹕ context = [email protected], intent.getAction() = android.intent.action.PACKAGE_REMOVED, intent.getDataString() = package:com.iptviq.mobile.android.skynettv
10-07 10:54:31.393 12624-12624/com.iptviq.mobile.android.skynettv E/IN CACHE﹕ +
10-07 10:54:31.413 12624-12624/com.iptviq.mobile.android.skynettv E/Returning channel_list﹕ null
10-07 10:54:31.423 12624-12624/com.iptviq.mobile.android.skynettv E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.iptviq.mobile.android.skynettv/com.iptviq.mobile.android.engine.SkynetTvMainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5039)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.iptviq.mobile.android.engine.SkynetTvMainActivity.onCreate(SkynetTvMainActivity.java:202)
at android.app.Activity.performCreate(Activity.java:5104)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5039)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
编辑2:
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
activity = this;
preferences = getSharedPreferences("settings", MODE_PRIVATE);
SERVER_IP = preferences.getString("serverIP", "192.168.37.14");
SERVERPORT = preferences.getString("serverPort", "8221");
areChannelsInCache = preferences.getBoolean("areChannelsInCache", false);
filename = preferences.getString("fileName", filename);
if (!areChannelsInCache) {
Log.e("NOT IN CACHE", "+");
mDownloadChannelsTask = new DownloadChannelsTask();
mDownloadChannelsTask.execute();
} else {
Log.e("IN CACHE", "+");
FileInputStream fis = null;
ObjectInputStream in = null;
try {
fis = openFileInput(filename);
in = new ObjectInputStream(fis);
mChannelManager = (ChannelManager) in.readObject();
Log.e("mChannelManager", mChannelManager.getChannel_list().get(3) + "");
in.close();
fis.close();
} catch (IOException ex) {
Log.e("mChannelManager", "error1 on reading " + ex);
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
Log.e("mChannelManager", "error2 on reading " + ex);
ex.printStackTrace();
}
}
}
的AsyncTask工作正常(下载数据)。当它完成它调用被保存到文件处理程序:
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = openFileOutput(filename, Context.MODE_APPEND);
out = new ObjectOutputStream(fos);
out.writeObject(ChannelManager.mInstance);
out.close();
fos.close();
Log.e("SAVED TO FILE", ":)");
preferences.edit().putBoolean("areChannelsInCache", true).commit();
preferences.edit().putString("fileName", filename).commit();
} catch (IOException ex) {
Log.e("error @ main on saving data to file", ":((" + ex);
ex.printStackTrace();
}
请张贴堆栈跟踪与异常 –
添加错误日志 – Ragaisis
您可以发布您的所有'create'方法之前,刷新你的输出流? –