Android httpurlconnection和基本身份验证
我真的很难对付虫子。使用的Api是v11,蜂巢3.0 我有一个asynctask在一个片段中,该片段通过基本身份验证从XMLAPI下载。即使我用EditText等更改了片段内的参数,它也能很好地工作。但是当我尝试从片段外变异autocompletetextview时,突然我得到了一个“第1行无元素。第0列”异常。我尝试了androidhttpclient,摆弄了systemprop(http.keepalive),并将其完全缩小到这个方法Android httpurlconnection和基本身份验证,android,http,android-asynctask,basic-authentication,httpurlconnection,Android,Http,Android Asynctask,Basic Authentication,Httpurlconnection,我真的很难对付虫子。使用的Api是v11,蜂巢3.0 我有一个asynctask在一个片段中,该片段通过基本身份验证从XMLAPI下载。即使我用EditText等更改了片段内的参数,它也能很好地工作。但是当我尝试从片段外变异autocompletetextview时,突然我得到了一个“第1行无元素。第0列”异常。我尝试了androidhttpclient,摆弄了systemprop(http.keepalive),并将其完全缩小到这个方法 public void setStations(Stri
public void setStations(String a, String b){
AutoCompleteTextView fromET = (AutoCompleteTextView ) getView().findViewById(R.id.from);
fromET.setText(a);
AutoCompleteTextView toET = (AutoCompleteTextView) getView().findViewById(R.id.to);
toET.setText(b);
}
当这个方法执行时,它会把我的下载任务搞砸。如果我手动编辑这些文本视图,效果很好
class LoadDataTask extends AsyncTask<String, Integer, ArrayList<Reisadvies>> {
private Exception ex;
private ProgressDialog pd;
protected void onPreExecute() {
//loadprogressdialog
}
protected ArrayList<Reisadvies> doInBackground(String... params) {
try{
ex = null;
return new APIreader().getRA(params[0], params[1], params[2],params[3],params[4],params[5], params[6]);
}catch (Exception e){
cancel(true);
pd.dismiss();
ex = e;
return null;
}
}
protected void onPostExecute(ArrayList<Reisadvies> ra){
//send list to activity
}
protected void onCancelled() {
super.onCancelled();
showError(ex);
}
}
};
public ArrayList<Reisadvies> getRA(String fromStation, String toStation, String viaStation, String dateTime, String departure, String hslAllowed, String yearCard) throws APIException{
try{
String uri = url(fromStation, toStation, viaStation, dateTime, departure, hslAllowed,yearCard);
URL url = new URL(uri);
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
if (!url.getHost().equals(uc.getURL().getHost())) {
throw new APIException("HotspotForwadingActive");
}
String basicAuth = "Basic " + "username:password"; //base64 encoded
uc.setRequestProperty ("Authorization", basicAuth);
uc.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "UTF-8"));
try{
return (ArrayList<Reisadvies>) new XMLParser().parseRP(in);
}finally{
uc.connect();
}
}catch (Exception e){
e.printStackTrace();
throw new APIException(e.getMessage());
}
}
class LoadDataTask扩展了AsyncTask{
私人例外;
私营部门;
受保护的void onPreExecute(){
//加载进度对话框
}
受保护的ArrayList doInBackground(字符串…参数){
试一试{
ex=null;
返回新的APIreader().getRA(参数[0]、参数[1]、参数[2]、参数[3]、参数[4]、参数[5]、参数[6]);
}捕获(例外e){
取消(真);
pd.解散();
ex=e;
返回null;
}
}
PostExecute上受保护的void(ArrayList ra){
//将列表发送到活动
}
受保护的void onCancelled(){
super.onCancelled();
淋浴器(ex);
}
}
};
公共数组列表getRA(字符串fromStation、字符串toStation、字符串viaStation、字符串dateTime、字符串离开、字符串hslAllowed、字符串yearCard)抛出异常{
试一试{
字符串uri=url(fromStation、toStation、viaStation、dateTime、出发、hslAllowed、yearCard);
URL=新的URL(uri);
HttpURLConnection uc=(HttpURLConnection)url.openConnection();
如果(!url.getHost().equals(uc.getURL().getHost())){
抛出新的APIException(“HotspotForwadingActive”);
}
字符串basicAuth=“Basic”+“用户名:密码”///base64编码
uc.setRequestProperty(“授权”,basicAuth);
uc.connect();
BufferedReader in=新的BufferedReader(新的InputStreamReader(uc.getInputStream(),“UTF-8”);
试一试{
返回(ArrayList)新的XMLParser().parseRP(in);
}最后{
uc.connect();
}
}捕获(例外e){
e、 printStackTrace();
抛出新的APIException(例如getMessage());
}
}
我认为在后台工作中存在一个问题:
pd.dismiss();
只能在UI线程中对UI元素执行操作。这意味着您可以在onPostExecute方法中执行此操作,或者,如果需要,可以使用runOnUiThread方法:
runOnUiThread(new Runnable() {
public void run() {
pd.dismiss();
}
});
我希望这是有帮助的…你在这一点上也是对的,但问题是不同的。刚发现这是一个很好的方法。应该马上就想出来,但由于它有时在有空间的情况下工作,所以被抛弃了:)