AsyncTask行为混乱

时间:2013-04-18 16:11:50

标签: android android-asynctask

我有这个项目:

我试图解决问题在哪里以及如何解决,但是这一点我真的不知道问题出在哪里。 我有一个按钮和TextView。 单击该按钮时,将调用此过程:

android:onClick="pulsaboton"

TextView向我显示输出。

这是Main_Activity.java

package com.example.pruebasonidos;

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

public class MainActivity extends Activity {
public String cadena1="", cadena2="";
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = (TextView) findViewById(R.id.textview01);
}
public class generamusica extends AsyncTask<String, Integer, Integer>
{
    @Override
    protected void onPreExecute(){
        tv.setText(tv.getText().toString()+"Pre Execute");  
    }

    @Override
    protected Integer doInBackground(String...strings) {

        String cadena=strings[0];
        tv.setText(tv.getText().toString()+cadena); 
        return null;
    }
    @Override
    protected void onPostExecute(Integer bytes){
        tv.setText(tv.getText().toString()+"Post Execute"); 
    }

}
public void pulsaboton(View v) {
cadena1="123"; cadena2="111";
tv.setText("");
new generamusica().execute(cadena1);
new generamusica().execute(cadena2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

单击pulsaboton时,textview1显示:

PreExecutePreExecute123111PostExecutePostExecute

我想要这个输出:

PreExecute123PostExecutePreExecute111PostExecute

错误是什么????

3 个答案:

答案 0 :(得分:0)

警告:在UI线外部执行接口修改!

protected Integer doInBackground(String...strings) {
    ...
    tv.setText(tv.getText().toString()+cadena); 
    ...
}

为什么您认为AsyncTask会曝光onPreExecuteonPostExecute?难道你不能在异步代码之前和之后在doInBackground中完成所有界面工作吗?

在Android中,需要从主线程前景线程访问UI;其中doInBackground 运行。

如果您需要在执行AsyncTask期间期间发布更新,请使用publishProgress机制。

编辑:“正确”访问界面要复杂得多,仅使用onPreExecuteonPostExecute。见this blog post。也许你应该试试Loader API,它不那么麻烦。

答案 1 :(得分:0)

首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。 从HONEYCOMB开始,任务在单个线程上执行,以避免因并行执行而导致的常见应用程序错误。

http://developer.android.com/reference/android/os/AsyncTask.html

您正在后台线程上更新ui,这是不可能的。你需要在ui线程上更新ui

在doInBackground()

   runOnUiThread(new Runnable() //run on ui thread
             {
              public void run() 
              {       
                   String cadena=strings[0];
                   tv.setText(tv.getText().toString()+cadena); ;
             }
             });

答案 2 :(得分:0)

对于您所需的输出在onPostExecute

中调用这两行
 cadena2="111";
    new generamusica().execute(cadena2);

并且不要尝试在后台线程中更新UI。

有关详细信息,请参阅This