AsyncTask执行一次(仅当应用程序启动时)



我真的不知道这是否是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.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);
        }
    }
}

这种布局:

<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"的TextView中显示远程XML的内容(是的,但不进行解析)。现在,问题是一切都很好,但只是第一次这样做,我的意思是它只工作一次,当你启动应用程序时。然后,如果您在EditText中输入另一个提要url并单击按钮,它将不会显示该提要的内容。事实上,我不知道显示内容后要做什么,因为我根本没有收到任何消息。

我真的不知道问题出在哪里。我只有1个布局和1.java,只是为了让你知道。

欢迎任何帮助,因为我是安卓系统的新手:)。

在asynctask类的postexecute中删除setcontentview,并在中声明和定义textview仅一次,您在中使用了两次。在全局、中初始化文本视图

TextView txtvFeed;  //globally
txtvFeed = (TextView) findViewById(R.id.txtvFeed);

像这样更改后执行,

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

试试这个代码。它应该起作用。。

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);
    }
}

}

最新更新