2013-05-06 3 views
0

В настоящее время я использую XMLPullParser для анализа страницы из API вокзалов. Я делаю это, используя задачу Async, чтобы идти в ногу с новыми версиями Android.User Input to Url using Async Task

В настоящее время я жестко закодировал XML-строку в классе и результаты отображаются в виде списка.

Однако у меня возникли проблемы с добавлением baseURL, чтобы добавить запрос пользователя в конец его. У меня не было никаких проблем делать это перед использованием ASync задач с помощью кода вдоль этих линий:

public void StationDetails(){ 
    //--- Search button --- 
    Button btnSearch = (Button) findViewById(R.id.btnSearch); 
    btnSearch.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

    //--- EditText View --- 
    EditText input = (EditText) findViewById(R.id.inputStation); 
    StringBuilder URL = new StringBuilder(baseURL); 
    URL.append(input); 
    String fullURL = URL.toString(); 
      } 
     }); 
     } 

Но я не могу связать это в методе асинхронным. Кажется, я не могу найти что-либо в Интернете и очень ценю любую помощь в этом вопросе.

Вот класс со строкой жёстко:

public class Realtime extends Activity { 

// Irish Rail Site URL 
private static final String baseURL = "http://api.irishrail.ie/realtime/realtime.asmx/getStationDataByNameXML?StationDesc=Malahide"; 
// XML TAG Name 
private static final String TAG_ITEM = "objStationData"; 
private static final String TAG_ORIGIN = "Origin"; 
private static final String TAG_DEST = "Destination"; 
private static final String TAG_SCHARR = "Scharrival"; 
private static final String TAG_EXPARR = "Exparrival"; 
private static final String TAG_DIRECT = "Direction"; 
private static final String TAG_STAT = "Status"; 
private static final String TAG_TRAINTYPE = "Traintype"; 

private RealtimeListviewAdapter mAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.stations_realtime_layout); 

    ListView listView = (ListView) findViewById(R.id.listview); 
    mAdapter = new RealtimeListviewAdapter(this); 
    // set adapter 
    listView.setAdapter(mAdapter); 
    // use AsyncTask to parse the URL data 
    ParseTask task = new ParseTask(this); 
    task.execute(baseURL); 

    // --- Register the list view for long press menu options 
    registerForContextMenu(listView); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

private class ParseTask extends 
     AsyncTask<String, Void, ArrayList<StationDetails>> { 
    private ProgressDialog dialog; 

    public ParseTask(Context c) { 
     dialog = new ProgressDialog(c); 
    } 

    @Override 
    protected void onPreExecute() { 
     dialog.setMessage("Loading Station Info..."); 
     dialog.show(); 
    } 

    @Override 
    protected ArrayList<StationDetails> doInBackground(String... params) { 
     String strUrl = params[0]; 
     HttpURLConnection httpConnection = null; 
     InputStream is = null; 
     try { 
      URL url = new URL(strUrl); 
      httpConnection = (HttpURLConnection) url.openConnection(); 
      httpConnection.setRequestMethod("GET"); 
      httpConnection.setConnectTimeout(10000); 
      httpConnection.setReadTimeout(10000); 
      httpConnection.connect(); 
      int responseCode = httpConnection.getResponseCode(); 
      if (responseCode == HttpURLConnection.HTTP_OK) { 
       is = httpConnection.getInputStream(); 
       return parseNews(is); 
      } 

     } catch (Exception e) { 
      // TODO 
     } finally { 
      if (is != null) { 
       try { 
        is.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      if (httpConnection != null) { 
       httpConnection.disconnect(); 
       httpConnection = null; 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<StationDetails> result) { 
     // set the result 
     mAdapter.setData(result); 
     // notify to refresh 
     mAdapter.notifyDataSetChanged(); 

     // Close the progress dialog 
     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 
    } 
} 

private ArrayList<StationDetails> parseNews(InputStream in) 
     throws XmlPullParserException, IOException { 
    ArrayList<StationDetails> newsList = new ArrayList<StationDetails>(); 
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
    XmlPullParser pullParser = factory.newPullParser(); 
    pullParser.setInput(in, "UTF-8"); 
    int eventType = pullParser.getEventType(); 
    StationDetails item = null; 
    while (eventType != XmlPullParser.END_DOCUMENT) { 
     String tagName; 

     if (eventType == XmlPullParser.START_TAG) { 
      tagName = pullParser.getName(); 
      if (tagName.equals(TAG_ITEM)) { 
       item = new StationDetails(); 
      } else if (tagName.equals(TAG_ORIGIN)) { 
       if (item != null) { 
        item.mOrigin = pullParser.nextText(); 
       } 

      } else if (tagName.equals(TAG_DEST)) { 
       if (item != null) { 
        item.mDestination = pullParser.nextText(); 
       } 
      } else if (tagName.equals(TAG_SCHARR)) { 
       if (item != null) { 
        item.mSchArrival = pullParser.nextText(); 
       } 
      } else if (tagName.equals(TAG_EXPARR)) { 
       if (item != null) { 
        item.mExpArrival = pullParser.nextText(); 
       } 
      } else if (tagName.equals(TAG_DIRECT)) { 
       if (item != null) { 
        item.mDirection = pullParser.nextText(); 
       } 
      } else if (tagName.equals(TAG_STAT)) { 
       if (item != null) { 
        item.mStatus = pullParser.nextText(); 
       } 
      } 

     } else if (eventType == XmlPullParser.END_TAG) { 
      tagName = pullParser.getName(); 
      if (tagName.equals(TAG_ITEM)) { 
       newsList.add(item); 
       item = null; 

      } 
     } 
     eventType = pullParser.next(); 
    } 
    return newsList; 
} 

EDIT UPDATE

Ok я поставил StringBuilder для fullURL в onClickListener для кнопки. Теперь я хочу выполнить задачу при нажатии кнопки. Я переместил задачу parsetask, .excute и т. Д. В этот clickListener. Однако это дает мне ошибку, говоря, что View.OnClickListener для реального времени не определено, я следую быстрым исправлениям, но затем при запуске приложения я получаю сообщение об ошибке в сообщении logcat, которое нельзя передать в файл android.content.Context.

Heres фрагмент того, что код выглядит теперь, после быстрого исправления

searchBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // Append user input to baseURL 
      StringBuilder URL = new StringBuilder(baseURL); 
      URL.append(userInput); 
      String fullURL = URL.toString(); 

      // use AsyncTask to parse the URL data 
      ParseTask task = new ParseTask(this); 
      task.execute(fullURL); 
     } 
    }); 

public ParseTask(OnClickListener onClickListener) { 
     dialog = new ProgressDialog((Context) onClickListener); 
    } 

и мой LogCat:

enter image description here

Я до сих пор не могу понять это и anybodys помощь будет быть очень welcom

ответ

0

OK проблема решена.

Что случилось, я не принимал userinput и добавлял его к URL правильно. Любите, как все так просто. И я также использовал Realtime.это, как предложил Глеб. Спасибо за вашу помощь. Heres код в onClickListener, который работает ...

searchBtn.setOnClickListener(new View.OnClickListener() { 

     private String userInput; 

     @Override 
     public void onClick(View v) { 
      ListView listView = (ListView) findViewById(R.id.listview); 
      mAdapter = new RealtimeListviewAdapter(Realtime.this); 
      //set adapter 
      listView.setAdapter(mAdapter); 
      StringBuilder URL = new StringBuilder(baseURL); 
      etStation = (EditText) findViewById(R.id.inputStation); 
      userInput = etStation.getText().toString(); 
      URL.append(userInput); 
      String fullURL = URL.toString(); 
      //use AsyncTask to parse the RSS data 
      ParseTask task = new ParseTask(Realtime.this); 
      task.execute(fullURL); 
     } 
    }); 
0

Почему вы просто не отправляете полный URL-адрес AsyncTask? Будет выглядеть примерно так:

StringBuilder URL = new StringBuilder(baseURL); 
URL.append(input); 
String fullURL = URL.toString();// use AsyncTask to parse the URL data 
ParseTask task = new ParseTask(this); 
task.execute(fullURL); 
+0

Я попытался положить, что в OnCreate метод некоторое время назад, и это дает мне: Конструктор Realtime.ParseTask (новый View.OnClickListener() {}) это неопределенная ошибка. Я пытаюсь выполнить две быстрые исправления, которые она дает для изменения или создания конструктора, но затем, когда я запускаю приложение, я не получаю ответа – sFay

+0

Вы уверены, что передаете правильный контекст в свою парсеть? Проверьте это: http://stackoverflow.com/questions/9506778/progressdialog-using-asynctask-producing-constructor-undefined-error – Gleb

+0

Да, я почти уверен, что я, поскольку вы можете видеть, что мой метод parsetask имеет (Context c), который используется с диалогом, а затем onPreExecute(). может ли построить строку в любом из этих методов? – sFay