2013-04-18 80 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瞭解更多信息