2014-04-29 131 views
0

我試圖將JSON保存到內部存儲器,以減少我的應用程序訪問網絡的次數,並加速性能。我遇到的問題似乎是從未創建文件。寫入並訪問JSON文件保存到內部存儲器

寫入文件:

protected JSONObject doInBackground(String... arg0) { 
      JSONParser jParser = new JSONParser(); 

      // Get JSON from URL 
      JSONObject json = jParser.getJSONFromUrl(url); 
      JSONObject runeInfo = jParser.getJSONFromUrl(url2); 
      Log.i("Main JSON", "" + json); 

      // Get JSON containing Rune Info and cache it 
      String jsonString = runeInfo.toString(); 
      File file = new File(getFilesDir(), "runesInfo.json"); 

      FileOutputStream fOut = null; 
      try { 
       fOut = openFileOutput("runesInfo.json", Context.MODE_PRIVATE); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      try { 
       fOut.write(jsonString.getBytes()); 
       fOut.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      Log.d("Cache", "Cache Complete"); 

      return json; 
     } 

從文件中讀取:

public class GetRunes extends AsyncTask<String, String, String> { 


     protected String doInBackground(String[] runeId) { 

      String readJson = null; 
      String name = null; 

      try { 
       FileInputStream fis = openFileInput("runesInfo.json"); 
       InputStreamReader isr = new InputStreamReader(fis); 

       fis.read(readJson.getBytes()); 
       JSONObject storedJson = new JSONObject(readJson); 
       Log.d("Stored JSON", "" + storedJson); 
       JSONObject idJson = storedJson.getJSONObject("data"); 
       JSONObject single = idJson.getJSONObject(runeId[0]); 

       try { 
        name = single.getString("name"); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (StreamCorruptedException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return name; 
     } 
    } 

我的logcat:

04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ java.util.concurrent.ExecutionException: java.lang.NullPointerException 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:223) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask.get(FutureTask.java:82) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.get(AsyncTask.java:482) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData.getRuneInfo(GetStaticData.java:36) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.RunesActivity$GetRunes.onPostExecute(RunesActivity.java:150) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.RunesActivity$GetRunes.onPostExecute(RunesActivity.java:46) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:631) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99) 
04-29 19:00:30.237  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4745) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ Caused by: java.lang.NullPointerException 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.content.ContextWrapper.openFileInput(ContextWrapper.java:159) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetRunes.doInBackground(GetStaticData.java:165) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetRunes.doInBackground(GetStaticData.java:156) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
04-29 19:00:30.241  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.Thread.run(Thread.java:856) 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ java.util.concurrent.ExecutionException: java.lang.NullPointerException 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:223) 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask.get(FutureTask.java:82) 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.get(AsyncTask.java:482) 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData.getRuneInfo(GetStaticData.java:36) 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.RunesActivity$GetRunes.onPostExecute(RunesActivity.java:150) 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.RunesActivity$GetRunes.onPostExecute(RunesActivity.java:46) 
04-29 19:00:30.245  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:631) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4745) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ Caused by: java.lang.NullPointerException 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.content.ContextWrapper.openFileInput(ContextWrapper.java:159) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetRunes.doInBackground(GetStaticData.java:165) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetRunes.doInBackground(GetStaticData.java:156) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
04-29 19:00:30.249  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.Thread.run(Thread.java:856) 
04-29 19:00:30.253  890-890/edu.appdesign.leaguestats W/System.err﹕ java.util.concurrent.ExecutionException: java.lang.NullPointerException 
04-29 19:00:30.253  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:223) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask.get(FutureTask.java:82) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.get(AsyncTask.java:482) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData.getRuneInfo(GetStaticData.java:36) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.RunesActivity$GetRunes.onPostExecute(RunesActivity.java:150) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.RunesActivity$GetRunes.onPostExecute(RunesActivity.java:46) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:631) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 
04-29 19:00:30.257  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4745) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ Caused by: java.lang.NullPointerException 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.content.ContextWrapper.openFileInput(ContextWrapper.java:159) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetRunes.doInBackground(GetStaticData.java:165) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at edu.appdesign.leaguestats.GetStaticData$GetRunes.doInBackground(GetStaticData.java:156) 
04-29 19:00:30.261  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287) 
04-29 19:00:30.265  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-29 19:00:30.265  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-29 19:00:30.265  890-890/edu.appdesign.leaguestats W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
04-29 19:00:30.265  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
04-29 19:00:30.265  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
04-29 19:00:30.265  890-890/edu.appdesign.leaguestats W/System.err﹕ at java.lang.Thread.run(Thread.java:856) 
04-29 19:00:34.009  995-995/edu.appdesign.leaguestats I/Process﹕ Sending signal. PID: 995 SIG: 9 

GetStaticData.java:165:

FileInputStream fis = openFileInput("runesInfo.json"); 

GetStaticData:

public class GetStaticData { 

    private static String api_key = "d96236d2-6ee3-4cfd-afa7-f41bdbc11128"; 
    public static String region = MainActivity.region.toLowerCase(); 

    public String getRuneInfo(String runeId) { 
     String name = null; 
     try { 
      name = new GetRunes() 
        .execute(runeId) 
        .get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 

     return name; 
    } 

    public String getChampionName(String champId) { 
     String name = null; 
     try { 
      name = new GetChampionName() 
        .execute(champId) 
        .get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 

     return name; 
    } 

    public static Summary getSummary(String summId) throws JSONException { 
     Summary summary = new Summary(); 
     try { 
      summary = new GetSummary() 
        .execute(summId) 
        .get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 

     return summary; 
    } 

    public static class GetChampionName extends AsyncTask<String, String, String> { 

     public static String champName; 

     protected String doInBackground(String[] champId) { 
      String url = "https://prod.api.pvp.net/api/lol/static-data/" + region + "/v1.2/champion/" + champId[0] + "?api_key=" + api_key; 
      JSONParser jsonParser = new JSONParser(); 
      JSONObject jsonObject = jsonParser.getJSONFromUrl(url); 
      Log.i("JSON", "" + jsonObject); 
      try { 
       champName = jsonObject.getString("key"); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return champName; 
     } 
    } 

    public static class GetSummary extends AsyncTask<String, String, Summary> { 

     protected Summary doInBackground(String[] summId) { 
      String url = "https://prod.api.pvp.net/api/lol/" + MainActivity.region.toLowerCase() + "/v1.3/stats/by-summoner/" + summId[0] + "/summary?season=SEASON4&api_key=" + api_key; 
      Log.i("Summary URL", url); 
      String url2 = "https://prod.api.pvp.net/api/lol/" + MainActivity.region.toLowerCase() + "/v2.3/league/by-summoner/" + summId[0] + "/entry?api_key=" + api_key; 
      JSONParser jsonParser = new JSONParser(); 
      JSONArrayParser jsonArrayParser = new JSONArrayParser(); 
      JSONObject jsonObject = jsonParser.getJSONFromUrl(url); 
      JSONArray jsonArray = jsonArrayParser.getJSONFromUrl(url2); 
      Summary summary = new Summary(); 
      Log.i("Stats JSON", "" + jsonObject); 
      JSONArray array; 
      JSONObject league; 
      try { 
       array = jsonObject.getJSONArray("playerStatSummaries"); 
       league = jsonArray.getJSONObject(0); 
       JSONObject rankedStats = array.getJSONObject(4); 
       JSONObject normalStats = array.getJSONObject(8); 
       summary.rWins = rankedStats.getString("wins"); 
       summary.rLoss = rankedStats.getString("losses"); 
       summary.nWins = normalStats.getString("wins"); 
       summary.rTier = league.getString("tier"); 
       summary.rLeague = league.getString("leagueName"); 
       summary.rRank = league.getString("rank"); 
       summary.rLeaguePoints = league.getString("leaguePoints"); 
       Log.i("Ranked", "" + summary.rWins + " " + summary.rLoss); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return summary; 
     } 
    } 

    public static class Summary { 
     public String rWins; 
     public String rLoss; 
     public String nWins; 
     public String rTier; 
     public String rLeague; 
     public String rRank; 
     public String rLeaguePoints; 

     public Summary() { 
      super(); 
     } 

     public Summary(String rWins, String rLoss, String nWins, String rTier, String rLeague, String rRank, String rLeaguePoints) { 
      super(); 
      this.rWins = rWins; 
      this.rLoss = rLoss; 
      this.nWins = nWins; 
      this.rTier = rTier; 
      this.rLeague = rLeague; 
      this.rRank = rRank; 
      this.rLeaguePoints = rLeaguePoints; 
     } 
    } 

    public class GetRunes extends AsyncTask<String, String, String> { 


     protected String doInBackground(String[] runeId) { 

      String readJson; 
      String name = null; 

      try { 
       FileInputStream fis = openFileInput("runesInfo.json"); 
       InputStreamReader isr = new InputStreamReader(fis); 

       fis.read(readJson.getBytes()); 
       JSONObject storedJson = new JSONObject(readJson); 
       Log.d("Stored JSON", "" + storedJson); 
       JSONObject idJson = storedJson.getJSONObject("data"); 
       JSONObject single = idJson.getJSONObject(runeId[0]); 


       try { 
        name = single.getString("name"); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (StreamCorruptedException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return name; 
     } 
    } 
} 
+1

你不能拍「擴展活動」在不屬於類由系統實例化爲一個活動,因爲系統在實際生命週期啓動後纔會獲得有效的上下文。你的類沒有任何活動生命週期方法,如onCreate()等,顯然不是一個活動。您需要一個有效的活動或應用程序或服務上下文來自其中一個的真正的子類,而不是錯誤的助手類,例如您嘗試在此處使用的助手類。 –

+0

@ChrisStratton我只是添加了以前的測試,說實話,完全忘了它在那裏。沒有它,除閱讀保存的文件外,所有方法都可以工作。我仍然不確定文件是否被保存。 – Nate

+1

openFileInput()**不應該存在於不能從Context繼承的類中**,**不能在擴展Context的子類但不被Android系統初始化的**中工作。要使用該方法,您必須傳入一個有效的,系統**初始化的**上下文,並將其稱爲它的一種方法。 –

回答

2

讓我們來看看openFileInput方法:

public FileInputStream openFileInput(String name) 
     throws FileNotFoundException { 
     return mBase.openFileInput(name); 
} 

NPE被拋出,因爲mBasenullmBase是什麼類型的?

Context mBase; 

我相信你GetStaticData類不是從任何Context基類繼承。如果是的話,你應該在它的構造函數提供自己Context

public GetStaticData(Context context) { 
    mContext = context; 
} 

,以後你應該使用這個Context撥打openFileInput

mContext.openFileInput(...) 
+0

我相信你是對的,但我仍然感到困惑。我在完整的GetStaticData文件中進行了編輯,供您查看。也許你可以告訴我更多。 – Nate

+0

刪除「擴展活動」,你可能會得到一個構建錯誤,顯示你試圖誤用一個不存在的上下文派生方法。 Nikis在這裏向你展示如何以正確的方式做到這一點,並在運行時傳遞一個有效的Context。 –

+0

@Nate好的,你有從Activity繼承的類,但是你沒有將它用於UI相關的事情,這是一個錯誤的設計。如果某些操作需要'Context',則可以在構造函數中提供它,不需要擴展'基於Context'的類。它的上下文還沒有初始化,當你調用'getRuneInfo'時,這就是原因。 – nikis

-1
public String loadJSONFromAsset() { 
    String json = null; 
    try { 

     InputStream is = getAssets().open("file_name.json"); 

     int size = is.available(); 

     byte[] buffer = new byte[size]; 

     is.read(buffer); 

     is.close(); 

     json = new String(buffer, "UTF-8"); 


    } catch (IOException ex) { 
     ex.printStackTrace(); 
     return null; 
    } 
    return json; 

} 
+1

從您的項目複製代碼不是沒有任何解釋的最佳解決方案 – nikis

+0

使用此行:InputStream is = getAssets()。open(「runesInfo.json」);導致與上述相同的錯誤。 – Nate

+1

無論如何,這不是一個適用的解決方案,因爲Assets在運行時是隻讀的,而這裏的目標是讀取和寫入。 –