2013-04-18 42 views
1

我有这样的项目:的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 

有什么错误? ??

+0

在pre-honeycomb api版本上运行上述操作? – Raghunandan

回答

0

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

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

为什么你认为AsyncTask暴露onPreExecuteonPostExecute?难道你不能只在doInBackground之前和之后在你的异步代码中完成所有的接口工作吗?

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

如果您需要在的AsyncTask的执行发布更新你的UI ,使用publishProgress机制。

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

0

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

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

你在后台线程这是不可能的,更新界面。你需要在UI线程

在doInBackground()

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

为了您所需的输出呼叫在onPostExecute这两条线路上更新用户界面,

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

并且不要尝试更新的用户界面后台线程。

请参阅This了解更多信息