2017-08-06 85 views
0

我正在努力使用與「openFileOutput()」關聯的「無法解析方法」。我懷疑我的問題與上下文有關,但不知道如何解決它。我有一個從異步任務(AirLineListRetriever.java)調用的文件處理類(FileHelper.java),該異步任務從網站讀取數據。從Activity調用AsynchTaskAndroid從類中讀取/寫入

FileHelper.java提取

public static boolean saveToFile(String data){ 
    try { 

     FileOutputStream fileOutputStream = openFileOutput("airlinedata.txt", MODE_PRIVATE); 
     OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); 
     outputStreamWriter.write(data); 
     outputStreamWriter.close(); 



     Log.d (TAG, "Airline List written to file"); 

     return true; 
    } catch(FileNotFoundException ex) { 
     Log.d(TAG, ex.getMessage()); 
    } catch(IOException ex) { 
     Log.d(TAG, ex.getMessage()); 
    } 
    return false; 


} 

doInBackground提取

   HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       StringBuilder stringBuilder = new StringBuilder(); 
       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        stringBuilder.append(line).append("\n"); 
       } 
       bufferedReader.close(); 



       FileHelper.saveToFile(stringBuilder.toString()); 
完全

class AirLineListRetriever extends AsyncTask<Void, Void, List<Airline>> { 

    private String FSAPIid = "appId=xxxxx"; 



    public interface AirLineListResponse{ 
     void processFinish(List<Airline> airlines); 
    } 

    AirLineListResponse delegate; 

    public AirLineListRetriever(AirLineListResponse delegate){ 
     this.delegate = delegate; 
    } 


    @Override 
    protected List<Airline> doInBackground(Void... params) { 

     JSONObject JSONAirlines; 
     JSONObject JSONAirline; 
     JSONArray JSONAirlinesList; 
     Airline airline; 
     List<Airline> airlineList; 

     try { 

      Log.d("ALPrint", "In Retrieve Airline List"); 

      URL url = new URL("https://api.flightstats.com/flex/airlines/rest/v1/json/active?" + FSAPIid); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       StringBuilder stringBuilder = new StringBuilder(); 
       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        stringBuilder.append(line).append("\n"); 
       } 
       bufferedReader.close(); 



       FileHelper.saveToFile(stringBuilder.toString()); 

       JSONAirlines = new JSONObject(stringBuilder.toString()); 
       JSONAirlinesList = JSONAirlines.getJSONArray("airlines"); 
       airlineList = new ArrayList<Airline>(); 

       for (int i = 0; i < JSONAirlinesList.length(); i++) { 
        JSONAirline = JSONAirlinesList.getJSONObject(i); 
        String airlineName = JSONAirline.has("name") ? JSONAirline.getString("name") : null; 
        String fsCode = JSONAirline.has("fs") ? JSONAirline.getString("fs") : null; 
        String iataCode = JSONAirline.has("iata") ? JSONAirline.getString("iata") : null; 
        String icaoCode = JSONAirline.has("icao") ? JSONAirline.getString("icao") : null; 

        airline = new Airline(
          airlineName, 
          fsCode, 
          iataCode, 
          icaoCode 
        ); 
        airlineList.add(airline); 

       } 

       return airlineList; 
      } finally { 
       urlConnection.disconnect(); 
      } 
     } catch (Exception e) { 
      Log.e("ERROR", e.getMessage(), e); 
      return null; 
     } 
    } 

    protected void onPostExecute(List<Airline> airlineList){ 
     this.delegate.processFinish(airlineList); 
    } 


} 

活性提取物

類異步調用異步類

new AirLineListRetriever(
      new AirLineListRetriever.AirLineListResponse() { 
       @Override 
       public void processFinish(List<Airline> airlines) { 

        String selectedAirLine = null; 
        airlineList = airlines; 

        Log.d("EndRetrieve", "Completed the retrieve"); 

        // sort the airline list 
        Collections.sort(airlineList, new Comparator<Airline>() { 
         @Override 
         public int compare(Airline airline, Airline t1) 
         { 
          Airline airline1 = (Airline) airline; 
          Airline airline2 = (Airline) t1; 
          return airline1.airlineName.compareToIgnoreCase(airline2.airlineName); 

         } 

        }); 

        final ArrayList airlineArrayList = new ArrayList(); 

        //copy the airline list to an array to populate the autoCompleteTextView 
        for (int i=0; i < airlineList.size(); i++){ 
         airlineArrayList.add(airlineList.get(i).airlineName); 
        } 

        progressDialog.dismiss(); 

        acAirlines = (AutoCompleteTextView) findViewById(R.id.autoCompleteAirLines); 
        acAirlines.setVisibility(View.VISIBLE); 
        //acAirlines.setThreshold(4); 

        final ArrayAdapter<String> adapter = new ArrayAdapter<String> (AddFlightActivity.this, android.R.layout.simple_list_item_1, airlineArrayList); 
        acAirlines.setThreshold(2); 
        acAirlines.setAdapter(adapter); 

        acAirlines.setOnItemClickListener(new AdapterView.OnItemClickListener() { 


         @Override 
         public void onItemClick(AdapterView<?> adapterView, View view, int index, long id) { 

          String selectedAirLine = adapter.getItem(index); 
          int position = airlineArrayList.indexOf(selectedAirLine); 
          String alIataCode = airlineList.get(position).iataCode; 
          Log.d("ALCodePrint", selectedAirLine + " " + alIataCode); 
          alCode.setText(alIataCode); 
          alCode_Set = true; 
          extFunctions.hideKeyboard(AddFlightActivity.this); 
         } 

        }); 

       } 
      } 
    ).execute(); 
+0

這是什麼課程? openFileOutput是Context的成員。如果你的班級不是Context的孩子,那麼這將不起作用 - 你必須在上下文中調用它,而不是你自己。 –

回答

2

傳遞上下文異步任務更改它的構造函數接收方面像下面,也傳遞到的SaveToFile方法。

class AirLineListRetriever extends AsyncTask<Void, Void, List<Airline>> { 

    private String FSAPIid = "appId=xxxxx"; 

    private Context mContext; 

    public interface AirLineListResponse{ 
     void processFinish(List<Airline> airlines); 
    } 

    AirLineListResponse delegate; 

    public AirLineListRetriever(AirLineListResponse delegate, Context context){ 
     this.delegate = delegate; 
     this.mContext = context; 
    } 


    @Override 
    protected List<Airline> doInBackground(Void... params) { 

     JSONObject JSONAirlines; 
     JSONObject JSONAirline; 
     JSONArray JSONAirlinesList; 
     Airline airline; 
     List<Airline> airlineList; 

     try { 

      Log.d("ALPrint", "In Retrieve Airline List"); 

      URL url = new URL("https://api.flightstats.com/flex/airlines/rest/v1/json/active?" + FSAPIid); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       StringBuilder stringBuilder = new StringBuilder(); 
       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        stringBuilder.append(line).append("\n"); 
       } 
       bufferedReader.close(); 



       FileHelper.saveToFile(stringBuilder.toString(), mContext); 

       JSONAirlines = new JSONObject(stringBuilder.toString()); 
       JSONAirlinesList = JSONAirlines.getJSONArray("airlines"); 
       airlineList = new ArrayList<Airline>(); 

       for (int i = 0; i < JSONAirlinesList.length(); i++) { 
        JSONAirline = JSONAirlinesList.getJSONObject(i); 
        String airlineName = JSONAirline.has("name") ? JSONAirline.getString("name") : null; 
        String fsCode = JSONAirline.has("fs") ? JSONAirline.getString("fs") : null; 
        String iataCode = JSONAirline.has("iata") ? JSONAirline.getString("iata") : null; 
        String icaoCode = JSONAirline.has("icao") ? JSONAirline.getString("icao") : null; 

        airline = new Airline(
          airlineName, 
          fsCode, 
          iataCode, 
          icaoCode 
        ); 
        airlineList.add(airline); 

       } 

       return airlineList; 
      } finally { 
       urlConnection.disconnect(); 
      } 
     } catch (Exception e) { 
      Log.e("ERROR", e.getMessage(), e); 
      return null; 
     } 
    } 

    protected void onPostExecute(List<Airline> airlineList){ 
     this.delegate.processFinish(airlineList); 
    } 


} 

在創建中的第二個參數的構造函數activty通方面ASYN任務,

new AirLineListRetriever(
      new AirLineListRetriever.AirLineListResponse() { 
       @Override 
       public void processFinish(List<Airline> airlines) { 

        String selectedAirLine = null; 
        airlineList = airlines; 

        Log.d("EndRetrieve", "Completed the retrieve"); 

        // sort the airline list 
        Collections.sort(airlineList, new Comparator<Airline>() { 
         @Override 
         public int compare(Airline airline, Airline t1) 
         { 
          Airline airline1 = (Airline) airline; 
          Airline airline2 = (Airline) t1; 
          return airline1.airlineName.compareToIgnoreCase(airline2.airlineName); 

         } 

        }); 

        final ArrayList airlineArrayList = new ArrayList(); 

        //copy the airline list to an array to populate the autoCompleteTextView 
        for (int i=0; i < airlineList.size(); i++){ 
         airlineArrayList.add(airlineList.get(i).airlineName); 
        } 

        progressDialog.dismiss(); 

        acAirlines = (AutoCompleteTextView) findViewById(R.id.autoCompleteAirLines); 
        acAirlines.setVisibility(View.VISIBLE); 
        //acAirlines.setThreshold(4); 

        final ArrayAdapter<String> adapter = new ArrayAdapter<String> (AddFlightActivity.this, android.R.layout.simple_list_item_1, airlineArrayList); 
        acAirlines.setThreshold(2); 
        acAirlines.setAdapter(adapter); 

        acAirlines.setOnItemClickListener(new AdapterView.OnItemClickListener() { 


         @Override 
         public void onItemClick(AdapterView<?> adapterView, View view, int index, long id) { 

          String selectedAirLine = adapter.getItem(index); 
          int position = airlineArrayList.indexOf(selectedAirLine); 
          String alIataCode = airlineList.get(position).iataCode; 
          Log.d("ALCodePrint", selectedAirLine + " " + alIataCode); 
          alCode.setText(alIataCode); 
          alCode_Set = true; 
          extFunctions.hideKeyboard(AddFlightActivity.this); 
         } 

        }); 

       } 
      }, this.getApplicationContext() 
    ).execute(); 

變化的SaveToFile簽名接收範圍內,

public static boolean saveToFile(String data, Context ctxt){.. 

然後用這方面打開文件流,

FileOutputStream fileOutputStream = ctxt.openFileOutput("airlinedata.txt", MODE_PRIVATE); 
+0

感謝JTeam。我開始沿着這條線開展工作,但是因爲saveToFile是從異步任務中調用的,所以好像我需要將上下文傳遞給異步任務 - 而這正是我放棄的地方。 – jcbird

+0

@jcbird請檢查編輯的答案。 – JTeam

+0

嗨JTeam我仍然在如何從活動傳遞上下文,通過異步任務saveToFile,還是我不得不看重組找到一種方法來從活動調用saveToFile? – jcbird

1

使用context

FileOutputStream fileOutputStream = context.openFileOutput("airlinedata.txt", context.MODE_PRIVATE);