我正在尝试编写一段代码片段,其中包含一个URL并将其文本内容显示在EditText视图中。这不顺利,我已经研究了其他链接,我认为给出了答案,例如从这里描述的AsyncTask进行网络调用:
Android Honeycomb: Fragment not able to start AsyncTask?
但这似乎不起作用。它实际上是我试图在这里使用的一个函数(调用另一个函数)。发布这些功能是为了完整性:
public static InputStream getInputStreamFromUrl(String url){
InputStream contentStream = null;
try{
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(new HttpGet(url));
contentStream = response.getEntity().getContent();
} catch(Exception e){
e.printStackTrace();
}
return contentStream;
}
public static String getStringFromUrl(String url) {
BufferedReader br = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(url)));
StringBuffer sb = new StringBuffer();
try{
String line = null;
while ((line = br.readLine())!=null){
sb.append(line);
}
}catch (IOException e){
e.printStackTrace();
}
return sb.toString();
}
这些是从我的:
调用的private class FragmentHttpHelper extends AsyncTask<Void, Void, Boolean>{
protected void onPostExecute(Boolean result) {
contractTextTxt.setText(getStringFromUrl(urlReferenceTxt.getText().toString()));
}
@Override
protected Boolean doInBackground(Void... params) {
// TODO Auto-generated method stub
return true;
}
}
单击获取网址按钮时执行的操作:
retrieveURLReferenceBtn.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
new FragmentHttpHelper().execute();
}
});
所以把东西放在一个asynctask我想我会绕过蜂窝3.0 NetworkOnMainThreadException但似乎没有。任何想法接下来要尝试什么?
答案 0 :(得分:1)
看起来您没有在AsyncTask中的doInBackground方法中进行实际的网络调用。这通常是你想要做的,然后将调用onPostExecute。我认为你的onPostExecute一旦启动AsyncTask就会被调用,因为你在doInBackground中没有做任何事情。
尝试将您的HttpClient代码移动到doInBackground方法中。
从我可以告诉它的运行方式如下:
点击按钮&gt;调用AsyncTask&gt;背景线程中没有任何事情发生&gt;调用postExecute尝试.setText(NETWORK CALL)...它回到你的UI线程上。
如果我错了,请纠正我。也许我看到了这个错误?
答案 1 :(得分:1)
getStringFromUrl
中调用 getInputStreamFromUrl
和doInBackground()
。您可以返回文本并将其设置为boolean
中的文本视图,而不是从doInBackground()
返回onPostExecute
。只有doInBackground()
方法在新线程中运行,因此您需要在此处执行所有与网络相关的内容,并在onPostExecute()
中更新UI。