プログラムが初めて起動する場合は、キャッシュにデータがないため、データをサーバーから (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();
}
ファイルに書き込まれた後に読み取ろうとすると正常に動作しますが、アプリを閉じるか強制終了してファイルから読み取ろうとすると、null ポインター例外が発生します:/
ファイル名を共有設定に保存して使用しようとしましたが、それでも null ポインター例外が発生しました (文字列/オブジェクト/メモリ参照の問題だと思いました)
では、問題はどこにあるのでしょうか (またはその可能性があるのでしょうか)。
エラーログ:
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 = android.app.ReceiverRestrictedContext@41597d68, 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();
}