Android AnsyncTask以打开网页

Android AnsyncTask以打开网页,android,Android,我正在尝试使用Asynctask方法从web服务器获取数据 我有以下代码 package com.example.myfirstapp; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; im

我正在尝试使用Asynctask方法从web服务器获取数据

我有以下代码

package com.example.myfirstapp;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class FetchData extends Activity {
private TextView textView;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fetch_data);
    textView = (TextView) findViewById(R.id.TextView1);


    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
}

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
          String response = "";
          for (String url : urls) {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            try {
              HttpResponse execute = client.execute(httpGet);
              InputStream content = execute.getEntity().getContent();

              BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
              String s = "";
              while ((s = buffer.readLine()) != null) {
                response += s;
              }

            } catch (Exception e) {
              e.printStackTrace();
            }
          }
          return response;
        }

        @Override
        protected void onPostExecute(String result) {
          textView.setText(result);
        }
      }

      public void readWebpage(View view) {
        DownloadWebPageTask task = new DownloadWebPageTask();
        task.execute(new String[] {message});

}



}
package com.example.myfirstapp;
导入java.io.BufferedReader;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入org.apache.http.HttpResponse;
导入org.apache.http.client.methods.HttpGet;
导入org.apache.http.impl.client.DefaultHttpClient;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.TextView;
公共类FetchData扩展活动{
私有文本视图文本视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u fetch\u data);
textView=(textView)findViewById(R.id.TextView1);
Intent=getIntent();
字符串消息=intent.getStringExtra(MainActivity.EXTRA_消息);
}
私有类下载WebPagetTask扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
字符串响应=”;
for(字符串url:url){
DefaultHttpClient=新的DefaultHttpClient();
HttpGet HttpGet=新的HttpGet(url);
试一试{
HttpResponse execute=client.execute(httpGet);
InputStream内容=execute.getEntity().getContent();
BufferedReader buffer=新的BufferedReader(新的InputStreamReader(内容));
字符串s=“”;
而((s=buffer.readLine())!=null){
响应+=s;
}
}捕获(例外e){
e、 printStackTrace();
}
}
返回响应;
}
@凌驾
受保护的void onPostExecute(字符串结果){
setText(结果);
}
}
公共作废阅读网页(查看){
DownloadWebPagetTask=新建DownloadWebPagetTask();
执行(新字符串[]{message});
}
}
我的问题是,这个FetchData活动必须从MainActivity接收数据。 我已经使用了意图来这样做。现在,我在这里使用的意图是来自MainActivity的数据。此消息包含web服务器的URL。我只需要使用该消息从网页获取结果。
我想将此消息传递给task.execute方法,以便它可以返回网页。我该怎么做呢?

除了
readWebpage
方法调用之外,您似乎已经具备了所有需要的功能

  • 更改
    readWebpage
    的参数以传递消息:

    public void readWebpage(String message) {
      DownloadWebPageTask task = new DownloadWebPageTask();
      task.execute(new String[] {message});
    }
    
  • 将调用
    readWebpage
    添加为创建
    onCreate
    中的最后一行:

    ...
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    readWebpage( message );
    

  • 为什么不直接将URL传递给构造函数中的
    DownloadWebPageTask
    ?实际上,URL必须根据用户输入的内容动态构建。我已经在MainActivity中创建了url。下一步是使用AsyncTask从该url获取结果。为此,我创建了第二个类FetchData,并使用意图来交换信息。刚才我将整个getIntent方法和字符串消息放在public void readWebpage()类中。我现在没有收到任何错误,但这会起作用吗?谢谢,这很有帮助。虽然它删除了错误,但我不确定是否正确定义了AsyncTask。我刚刚重用了其他地方的代码。你能确认一下它是否正确吗?哦,myy…一个新的代码…我正在遵循android开发者论坛上提到的代码..:-(是的……它成功了……现在唯一的问题是我的服务器返回了一个JSON字符串。我需要解析它并在列表视图中显示它……有什么想法吗?我应该使用内置的JSON解析器吗?。是的,当然……我在stackoverflow上提出了一个不同的问题,向我展示了一个代码片段,但那里的人拼命要求我发布我的代码。我是cur通过以下教程来编写代码。任何其他好的教程都肯定会对我有所帮助。:-)我的帖子如下:我给你发了一个链接希望对你有很大帮助:
    mWebView.setWebViewClient(new WebViewClient() {
            private int       webViewPreviousState;
            private final int PAGE_STARTED    = 0x1;
            private final int PAGE_REDIRECTED = 0x2;
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
                webViewPreviousState = PAGE_REDIRECTED;
                mWebView.loadUrl(urlNewString);
                return true;
            }
    
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                webViewPreviousState = PAGE_STARTED;
                if (dialog == null || !dialog.isShowing())
                    dialog = ProgressDialog.show(WebViewActivity.this, "", getString(R.string.loadingMessege), true, true,
                            new OnCancelListener() {
    
                                @Override
                                public void onCancel(DialogInterface dialog) {
                                    // do something
                                }
                            });
            }
    
            @Override
            public void onPageFinished(WebView view, String url) {
    
                if (webViewPreviousState == PAGE_STARTED) {
                    dialog.dismiss();
                    dialog = null;
                }
    
            }
     });