我有这个项目:
我试图解决问题在哪里以及如何解决,但是这一点我真的不知道问题出在哪里。 我有一个按钮和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
错误是什么????
答案 0 :(得分:0)
警告:在UI线外部执行接口修改!
protected Integer doInBackground(String...strings) {
...
tv.setText(tv.getText().toString()+cadena);
...
}
为什么您认为AsyncTask
会曝光onPreExecute
和onPostExecute
?难道你不能在异步代码之前和之后在doInBackground
中完成所有界面工作吗?
在Android中,需要从主线程前景线程访问UI;其中doInBackground
不运行。
如果您需要在执行AsyncTask
期间期间发布更新,请使用publishProgress
机制。
编辑:“正确”访问界面要复杂得多,仅使用onPreExecute
和onPostExecute
。见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