1

我有这个项目:

我试图不明白问题出在哪里以及如何解决,但这一点我真的不知道问题出在哪里。我有一个按钮和一个 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

错误是什么????

4

3 回答 3

0

首次引入时,AsyncTask 在单个后台线程上串行执行。从 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); ;
             }
             });
于 2013-04-18T16:18:31.080 回答
0

对于您所需的输出,请在 中调用这两行onPostExecute

 cadena2="111";
    new generamusica().execute(cadena2);

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

看到这个了解更多信息

于 2013-04-18T16:19:34.087 回答
0

警告:在 UI 线程之外执行的界面修改!

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

为什么你认为AsyncTask暴露onPreExecuteonPostExecute?您不能在doInBackground异步代码之前和之后完成所有界面工作吗?

在Android中,需要从主线程、前台线程访问UI;doInBackground没有运行。_

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

编辑:onPreExecute “正确”访问界面比仅使用and复杂得多onPostExecute。请参阅此博客文章。也许你应该试试LoaderAPI,它不那么麻烦。

于 2013-04-18T16:16:40.687 回答