Если программа запускается в первый раз, то в кеше нет данных, поэтому данные должны быть загружены с сервера (с помощью 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)
Edit 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();
}
пожалуйста, напишите трассировки стека с Exception –
Добавлено журнал ошибок – Ragaisis
Вы можете разместить все ваши 'create' метод? –