使用Android AsyncTask下载html文件
我刚开始使用android,正在开发一个简单的应用程序,可以下载html文件的内容。我按照建议使用AsyncTask,但我遇到了一个问题。在下面的代码中(我遵循了一个教程代码),对于使用Android AsyncTask下载html文件,android,android-asynctask,Android,Android Asynctask,我刚开始使用android,正在开发一个简单的应用程序,可以下载html文件的内容。我按照建议使用AsyncTask,但我遇到了一个问题。在下面的代码中(我遵循了一个教程代码),对于onPostExecute方法,我得到了tv无法解析的问题。如何访问下载的文件?谢谢各位: public class FlashResults extends Activity { @Override public void onCreate(Bundle savedInstanceState) {
onPostExecute
方法,我得到了tv无法解析的问题。如何访问下载的文件?谢谢各位:
public class FlashResults extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
setContentView(tv);
readWebpage(tv);
}
protected class DownloadPage extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls) {
String responseStr = null;
try {
for (String url : urls) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity httpEntity = httpResponse.getEntity();
responseStr = EntityUtils.toString(httpEntity);
}
} catch (UnsupportedEncodingException e) {
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return responseStr;
}
protected void onPostExecute(String result) {
tv.setText(result);
}
}
public void readWebpage(View v) {
DownloadPage task = new DownloadPage();
task.execute(new String[] { "http://seznam.cz" });
}
公共类FlashResults扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
TextView tv=新的TextView(此);
设置内容视图(电视);
阅读网页(电视);
}
受保护类下载页扩展异步任务{
受保护的字符串doInBackground(字符串…URL){
字符串responsest=null;
试一试{
对于(字符串url:url){
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpGet=新的HttpGet(url);
HttpResponse HttpResponse=httpClient.execute(get);
HttpEntity HttpEntity=httpResponse.getEntity();
responsest=EntityUtils.toString(httpEntity);
}
}捕获(不支持的编码异常e){
}捕获(客户端协议例外e){
}捕获(IOE异常){
}
返回响应;
}
受保护的void onPostExecute(字符串结果){
tv.setText(结果);
}
}
公众阅读网页(视图五){
DownloadPage任务=新建DownloadPage();
task.execute(新字符串[]{”http://seznam.cz" });
}
}如果希望在方法外部访问变量,则需要在方法外部声明它。这是一个称为范围的基本编程概念
将代码更改为如下所示:
public class FlashResults extends Activity {
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
setContentView(tv);
readWebpage(tv);
}
public class FlashResults extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
setContentView(tv);
readWebpage(tv);
}
public void readWebpage(View v) {
DownloadPage task = new DownloadPage(tv);
task.execute(new String[] { "http://seznam.cz" });
}
private static class DownloadPage extends AsyncTask<String, Void, String> {
private TextView textView;
public DownloadPage(TextView tv){
textView = tv;
}
protected String doInBackground(String... urls) {
String responseStr = null;
try {
for (String url : urls) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity httpEntity = httpResponse.getEntity();
responseStr = EntityUtils.toString(httpEntity);
}
} catch (UnsupportedEncodingException e) {
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return responseStr;
}
protected void onPostExecute(String result) {
if (textView != null) {
textView.setText(result);
}
}
}
}
而且它对FlashResults中的任何内容都是可用的,您必须使tv成为一个feild,才能从子类访问它
public class FlashResults extends Activity {
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
setContentView(tv);
readWebpage(tv);
}
protected class DownloadPage extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls) {
String responseStr = null;
try {
for (String url : urls) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity httpEntity = httpResponse.getEntity();
responseStr = EntityUtils.toString(httpEntity);
}
} catch (UnsupportedEncodingException e) {
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return responseStr;
}
protected void onPostExecute(String result) {
tv.setText(result);
}
}
public void readWebpage(View v) {
DownloadPage task = new DownloadPage();
task.execute(new String[] { "http://seznam.cz" });
}
}
公共类FlashResults扩展活动{
文本视图电视;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
tv=新文本视图(此);
设置内容视图(电视);
阅读网页(电视);
}
受保护类下载页扩展异步任务{
受保护的字符串doInBackground(字符串…URL){
字符串responsest=null;
试一试{
对于(字符串url:url){
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpGet=新的HttpGet(url);
HttpResponse HttpResponse=httpClient.execute(get);
HttpEntity HttpEntity=httpResponse.getEntity();
responsest=EntityUtils.toString(httpEntity);
}
}捕获(不支持的编码异常e){
}捕获(客户端协议例外e){
}捕获(IOE异常){
}
返回响应;
}
受保护的void onPostExecute(字符串结果){
tv.setText(结果);
}
}
公众阅读网页(视图五){
DownloadPage任务=新建DownloadPage();
task.execute(新字符串[]{”http://seznam.cz" });
}
}
尝试设置文本视图类级别变量
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
setContentView(tv);
readWebpage(tv);
}
另一个选项是将AsyncTask声明为匿名,在与任务声明相同的方法体中将TextView声明为final。
干杯一种方法是按照其他答案的建议去做,并制作tv
实例级。或者,您可以在AsyncTask
中创建TextView
字段,并将引用传递给构造函数:
...
public void readWebpage(TextView v) {
DownloadPage task = new DownloadPage(v);
task.execute(new String[] { "http://seznam.cz" });
}
...
protected class DownloadPage extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls) {
...
}
TextView tv = null;
public DownloadPage(TextView tv){
this.tv = tv;
}
...
}
。。。
公共无效阅读网页(TextView v){
下载页面任务=新下载页面(v);
task.execute(新字符串[]{”http://seznam.cz" });
}
...
受保护类下载页扩展异步任务{
受保护的字符串doInBackground(字符串…URL){
...
}
TextView tv=null;
公共下载页面(TextView tv){
this.tv=tv;
}
...
}
到目前为止,所有其他建议的答案都会奏效。不过,我想补充几点其他注意事项:
如果您仅访问此onCreate和DownloadPage活动中的TextViewtv
,则可以通过将其直接提供给DownloadPage的构造函数来限制对tv
的访问
对于像DownloadPage AsyncTask这样有用的东西,我通常将其从任何活动的内部类中删除,而是将其放在一个名为“Utils”的公共类中,该类可以根据需要由许多其他活动使用。(代码中的模块化)
如果要使用内部类(完全合法),最好将其设置为私有的和静态的
大概是这样的:
public class FlashResults extends Activity {
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
setContentView(tv);
readWebpage(tv);
}
public class FlashResults extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
setContentView(tv);
readWebpage(tv);
}
public void readWebpage(View v) {
DownloadPage task = new DownloadPage(tv);
task.execute(new String[] { "http://seznam.cz" });
}
private static class DownloadPage extends AsyncTask<String, Void, String> {
private TextView textView;
public DownloadPage(TextView tv){
textView = tv;
}
protected String doInBackground(String... urls) {
String responseStr = null;
try {
for (String url : urls) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity httpEntity = httpResponse.getEntity();
responseStr = EntityUtils.toString(httpEntity);
}
} catch (UnsupportedEncodingException e) {
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return responseStr;
}
protected void onPostExecute(String result) {
if (textView != null) {
textView.setText(result);
}
}
}
}
公共类FlashResults扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
TextView tv=新的TextView(此);
设置内容视图(电视);
阅读网页(电视);
}
公众阅读网页(视图五){
下载页面任务=新建下载页面(电视);
task.execute(新字符串[]{”http://seznam.cz" });
}
私有静态类DownloadPage扩展异步任务{
私有文本视图文本视图;
公共下载页面(TextView tv){
文本视图=电视;
}
受保护的字符串doInBackground(字符串…URL){
字符串responsest=null;
试一试{
对于(字符串url:url){
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpGet=新的HttpGet(url);
HttpResponse HttpResponse=httpClient.execute(get);
HttpEntity HttpEntity