Java AsyncTask执行一次(仅当应用程序启动时)
我真的不知道这是否是一个异步任务问题,但就我所见,这个类似乎缺少了一些东西 我有以下代码:Java AsyncTask执行一次(仅当应用程序启动时),java,android,android-asynctask,Java,Android,Android Asynctask,我真的不知道这是否是一个异步任务问题,但就我所见,这个类似乎缺少了一些东西 我有以下代码: package com.example.webserviceejemplo; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.h
package com.example.webserviceejemplo;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.view.View.OnClickListener;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class ActividadPrincipal extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad_principal);
// Objectos de la vista
final TextView txtvFeed = (TextView) findViewById(R.id.txtvFeed);
final EditText txtXMLUrl = (EditText) findViewById(R.id.txtXMLUrl);
final Button btnMostrarXML = (Button) findViewById(R.id.btnMostrarXML);
// Scroll vertical (mas una propiedad en el XML)
txtvFeed.setMovementMethod(new ScrollingMovementMethod());
btnMostrarXML.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
new XMLHandler().execute(txtXMLUrl.getText().toString());
}
});
}
private class XMLHandler extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... urls)
{
String xml = null;
try
{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(urls[0]);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return xml;
}
@Override
protected void onPostExecute(String result)
{
setContentView(R.layout.actividad_principal);
TextView txtvFeed = (TextView) findViewById(R.id.txtvFeed);
txtvFeed.setText(result);
}
}
}
package com.example.webserviceejempo;
导入java.io.IOException;
导入java.io.UnsupportedEncodingException;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.client.ClientProtocolException;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.util.EntityUtils;
导入android.view.view.OnClickListener;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.text.method.ScrollingMovementMethod;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
公共类活动主体扩展活动
{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad_principal);
//维斯塔酒店
最终文本视图txtvFeed=(文本视图)findViewById(R.id.txtvFeed);
最终EditText txtXMLUrl=(EditText)findViewById(R.id.txtXMLUrl);
最后一个按钮btnMostrarXML=(按钮)findViewById(R.id.btnMostrarXML);
//垂直滚动(mas una propiedad en el XML)
setMovementMethod(新的ScrollingMovementMethod());
btnMostrarXML.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v)
{
新的XMLHandler().execute(txtXMLUrl.getText().toString());
}
});
}
私有类XMLHandler扩展了异步任务
{
@凌驾
受保护的字符串doInBackground(字符串…URL)
{
字符串xml=null;
尝试
{
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(URL[0]);
HttpResponse HttpResponse=httpClient.execute(httpPost);
HttpEntity HttpEntity=httpResponse.getEntity();
xml=EntityUtils.toString(httpEntity);
}
捕获(不支持的编码异常e)
{
e、 printStackTrace();
}
捕获(客户端协议例外e)
{
e、 printStackTrace();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
返回xml;
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
setContentView(R.layout.actividad_principal);
TextView txtvFeed=(TextView)findViewById(R.id.txtvFeed);
txtvFeed.setText(结果);
}
}
}
这个布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${packageName}.${activityClass}" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/url_to_show"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/txtXMLUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textUri" >
<requestFocus />
</EditText>
<Button
android:id="@+id/btnMostrarXML"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:text="@string/show_xml" />
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txtvFeed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:text="@string/feed_to_display" />
</LinearLayout>
</ScrollView>
</LinearLayout>
我想做的是单击按钮并在名为“txtvFeed”的文本视图中显示远程XML的内容(是的,不进行解析)。现在的问题是,所有的工作都很好,但就在您第一次这样做时,我的意思是,当您启动应用程序时,它只工作一次。然后,如果在EditText中输入另一个提要url并单击该按钮,它将不会显示该提要的内容。事实上,我不知道显示内容后在做什么,因为我根本没有收到任何消息
我根本不知道问题出在哪里。我只有1个layout和1.java,仅供您参考
欢迎任何帮助,因为我是Android的新手:)。试试这段代码。它应该有用
public class ActividadPrincipal extends Activity
{
final TextView txtvFeed;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad_principal);
// Objectos de la vista
txtvFeed = (TextView) findViewById(R.id.txtvFeed);
final EditText txtXMLUrl = (EditText) findViewById(R.id.txtXMLUrl);
final Button btnMostrarXML = (Button) findViewById(R.id.btnMostrarXML);
// Scroll vertical (mas una propiedad en el XML)
txtvFeed.setMovementMethod(new ScrollingMovementMethod());
btnMostrarXML.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
new XMLHandler().execute(txtXMLUrl.getText().toString());
}
});
}
private class XMLHandler extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... urls)
{
String xml = null;
try
{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(urls[0]);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return xml;
}
@Override
protected void onPostExecute(String result)
{
txtvFeed.setText(result);
}
}
公共类活动主体扩展活动
{
最终文本视图txtvFeed;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad_principal);
//维斯塔酒店
txtvFeed=(TextView)findViewById(R.id.txtvFeed);
最终EditText txtXMLUrl=(EditText)findViewById(R.id.txtXMLUrl);
最后一个按钮btnMostrarXML=(按钮)findViewById(R.id.btnMostrarXML);
//垂直滚动(mas una propiedad en el XML)
setMovementMethod(新的ScrollingMovementMethod());
btnMostrarXML.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v)
{
新的XMLHandler().execute(txtXMLUrl.getText().toString());
}
});
}
私有类XMLHandler扩展了异步任务
{
@凌驾
受保护的字符串doInBackground(字符串…URL)
{
字符串xml=null;
尝试
{
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(URL[0]);
HttpResponse HttpResponse=httpClient.execute(httpPost);
HttpEntity HttpEntity=httpResponse.getEntity();
xml=EntityUtils.toString(httpEntity);
}
捕获(不支持的编码异常e)
{
e、 printStackTrace();
}
捕获(客户端协议例外e)
{
e、 printStackTrace();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
返回xml;
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
txtvFeed.setText(结果);
}
}
}在asynctask类中删除postexecute中的setcontentview,并在中仅声明和定义一次textview,您在中使用了两次。全局初始化文本视图
TextView txtvFeed; //globally
txtvFeed = (TextView) findViewById(R.id.txtvFeed);
像这样更改postexecute
@Override
protected void onPostExecute(String result)
{
txtvFeed.setText(result);
}
这与上面的答案几乎相同,因此我将对其进行更新投票,但在onCreate函数之外使其成为最终结果不允许您在:P之后对其进行更改。