2013-05-06 52 views
0

我目前使用XMLPullParser来解析从火车站API的页面。我正在使用Async任务来跟上新版本的android。用户输入到Url使用异步任务

目前我已经将XML字符串硬编码到类中,并将结果显示在列表视图中。

但是,我无法附加baseURL以将用户输入的查询添加到它的末尾。我没有任何麻烦,使用使用代码沿着这些线路异步任务之前这样做:

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; 
} 

编辑 UPDATE

好吧,我把StringBuilder的为fullURL在onClickListener的按钮。现在我想要的是当按钮被点击时执行任务。我将parsetask任务,.excute等移动到了这个clickListener中。然而,这给了我一个错误,说实时的View.OnClickListener是未定义的,我遵循快速修复,但是当运行该项目时,我在logcat中得到一个错误,说不能转换为android.content.Context。

继承人的代码是什么样子,现在速战速决

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

我仍然无法想出解决办法和任何人的帮助会非常欢迎

回答

0

好的问题解决了。

发生了什么是我没有采取userinput并正确地将其附加到URL。喜欢有时候事情如此简单。我也使用Realtime.this Gleb建议。谢谢你的帮助。继承人在工作中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 2013-05-06 10:23:14

+0

您确定要将正确的上下文传递给ParseTask吗?检查这一个:http://stackoverflow.com/questions/9506778/progressdialog-using-asynctask-producing-constructor-undefined-error – Gleb 2013-05-06 12:08:40

+0

是的,我几乎积极我是,因为你可以看到我的parsetask方法有(上下文c)用于对话框,然后onPreExecute()。在任何一种方法中建立字符串都有帮助吗? – sFay 2013-05-06 17:08:28