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

编辑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

请张贴堆栈跟踪与异常 –

+0

添加错误日志 – Ragaisis

+1

您可以发布您的所有'create'方法之前,刷新你的输出流? –

回答

0

关闭

+0

FileInputStream和ObjectInputStream没有刷新方法 – Ragaisis