[英]Android Read/Write from class
我正在為與openFileOutput()
關聯的“無法解析方法”而苦苦掙扎。 我懷疑我的問題與上下文有關,但不知道如何解決。 我有一個文件處理類( FileHelper.java
),該類從異步任務( AirLineListRetriever.java
)中調用,該異步任務從網站讀取數據。 從Activity
調用AsynchTask
。
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();
要將上下文傳遞給異步任務,請更改其構造函數以接收如下所示的上下文,並將其也傳遞給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);
}
}
在活動中創建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);
使用context
:
FileOutputStream fileOutputStream = context.openFileOutput("airlinedata.txt", context.MODE_PRIVATE);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.