2013-10-07 13 views
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) 

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(); 
    } 
+0

пожалуйста, напишите трассировки стека с Exception –

+0

Добавлено журнал ошибок – Ragaisis

+1

Вы можете разместить все ваши 'create' метод? –

ответ

0

Промойте свой выходной поток перед закрытием

+0

FileInputStream и ObjectInputStream не имеют метода очистки – Ragaisis

Смежные вопросы