Android AnsyncTask以打开网页
我正在尝试使用Asynctask方法从web服务器获取数据 我有以下代码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
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;
}
}
});