Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android AsyncTask下载html文件_Android_Android Asynctask - Fatal编程技术网

使用Android AsyncTask下载html文件

使用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) {

我刚开始使用android,正在开发一个简单的应用程序,可以下载html文件的内容。我按照建议使用AsyncTask,但我遇到了一个问题。在下面的代码中(我遵循了一个教程代码),对于
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活动中的TextView
    tv
    ,则可以通过将其直接提供给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