2012-03-16 67 views
3

UPDATE1的AsyncTask:使值到一個活動(onCreate方法)

活性:

public Integer _number = 0; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
if (_number >0) 
     { 
      Log.d("onSuccessfulExecute", ""+_number); 
     } 
     else 
     { 
      Log.d("onSuccessfulExecute", "nope empty songs lists"); 
     } 
} 

public int onSuccessfulExecute(int numberOfSongList) { 

_number = numberOfSongList; 

if (numberOfSongList >0) 
{ 
    Log.d("onSuccessfulExecute", ""+numberOfSongList); 
} 
else 
{ 
    Log.d("onSuccessfulExecute", "nope empty songs lists"); 
} 
    return numberOfSongList; 
} 

端UPDATE1

UPDATE:AsynchTask有它自己的外部類。

如何從的AsyncTask onPostExecute()...傳遞一個價值活動

我的代碼並從onPostExecute返回值()和更新用戶界面,但我正在尋找一種方式來設置活動變量(NumberOfSongList )來自AsynchTask。

的AsyncTask類:

@Override 
    public void onPostExecute(asynctask.Payload payload) 
    { 
     AsyncTemplateActivity app = (AsyncTemplateActivity) payload.data[0]; 

      //the below code DOES UPDATE the UI textView control 
      int answer = ((Integer) payload.result).intValue(); 
      app.taskStatus.setText("Success: answer = "+answer); 

      //PROBLEM: 
      //i am trying to populate the value to an variable but does not seems like the way i am   doing: 
      app.NumberOfSongList = payload.answer; 
      .............. 
      .............. 
    } 

活動:

public Integer NumberOfSongList; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //Several UI Code 
     new ConnectingTask().execute(); 
     Log.d("onCreate", ""+NumberOfSongList); 

    } 
+0

如果你希望在'Log.v()'調用中看到'NumberOfSongsList',它可能不會發生,因爲'AsyncTask'沒有完成它的工作。 「asynctask.PayLoad」響應究竟是什麼? – Luksprog 2012-03-16 18:41:06

+0

它肯定不會在Log.d中更新(「onCreate ....你顯示的是.asyncTask和線程的開銷會保證這個。你檢查過的值是否在程序中稍後更新? – eyespyus 2012-03-16 18:44:57

+0

是的它的沒有更新log.di我意識到這一點..這就是爲什麼我需要幫助...是的,它確實更新onPostExecute的值,我可以看到它,但不在活動中。 – 2012-03-16 20:14:53

回答

2

使用setter方法怎麼樣?例如

private int _number; 
public int setNumber(int number) { 
    _number = number; 
} 

UPDATE:

請看看這段代碼。這將做你想要完成的事情。

Activity類

public class TestActivity extends Activity { 
    public int Number; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.test); 

     Button btnDisplay = (Button) findViewById(R.id.btnDisplay); 
     btnDisplay.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       Toast toast = Toast.makeText(v.getContext(), "Generated number: " + String.valueOf(Number), Toast.LENGTH_LONG); 
       toast.show();    
      } 
     }); 

     new TestTask(this).execute(); 
    } 
} 

的AsyncTask類

public class TestTask extends AsyncTask<Void, Void, Integer> { 
    private final Context _context; 
    private final String TAG = "TestTask"; 
    private final Random _rnd; 

    public TestTask(Context context){ 
     _context = context; 
     _rnd = new Random(); 
    } 

    @Override 
    protected void onPreExecute() { 
     //TODO: Do task init. 
     super.onPreExecute(); 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 
     //Simulate a long-running procedure. 
     try { 
      Thread.sleep(3000);   
     } catch (InterruptedException e) { 
      Log.e(TAG, e.getMessage()); 
     } 

     return _rnd.nextInt(); 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     TestActivity test = (TestActivity) _context; 
     test.Number = result;  
     super.onPostExecute(result); 
    } 
} 
+0

我嘗試與吸氣劑和二傳手,但也不工作 – 2012-03-16 20:11:43

+0

也不會工作,因爲AsyncTask沒有完成工作,因爲slukian指出,哪些是有道理的,我有我注意到,雖然我正在調試 – 2012-03-16 20:17:37

+0

謝謝,但我有一個問題,爲什麼我需要硬編碼的活動名稱'TestActivity測試=(TestActivity)_context;'我正在一個類,任何活動應該能夠打電話,但如果我走你的方法,我看到那個活動是硬編碼的......任何想法? – 2012-03-17 01:50:57

0

創建一個監聽。

建立一個新的類文件。稱它像MyAsyncListener,使它看起來像這樣:

public interface MyAsyncListener() { 
     onSuccessfulExecute(int numberOfSongList); 
} 

讓您的活動實施MyAsyncListener,即

public class myActivity extends Activity implements MyAsyncListener { 

監聽器添加到構造函數爲您的AsyncTask並將其設置爲一個全局變量在Async類中。然後在onPostExecute中調用監聽器的方法並傳遞數據。

public class MyCustomAsync extends AsyncTask<Void,Void,Void> { 

     MyAsyncListener mal; 

     public MyCustomAsync(MyAsyncListener listener) { 
      this.mal = listener; 
     } 

     @Override 
     public void onPostExecute(asynctask.Payload payload) { 
      \\update UI 
      mal.onSuccessfulExecute(int numberOfSongList); 
     } 
} 

現在,只要您的AsyncTask完成後,它會調用你的Activity類中的方法onSuccessfulExecute應該是這樣的:

@Override 
public void onSuccessfulExecute(int numberOfSongList) { 
     \\do whatever 
} 

好運。

+0

不起作用...沒有錯誤,但是不會顯示價值..我會更新問題 – 2012-03-16 20:41:10

1

謹慎的只是一個字:試圖在的AsyncTask舉行一個活動實例的引用時要非常小心 - 我發現這困難的方式:)。如果用戶在後臺任務仍在運行的情況下旋轉設備,則您的活動將被銷燬並重新創建,從而使對活動的引用無效。

+0

正如你所看到的,我一直在努力與AsyncTask在其自己的類而不是一個具有活動的子類,但似乎是非常具有挑戰性的....我開始意識到不會做任何差異,有自己的類與子類..任何想法? – 2012-03-16 20:48:20

+0

您可以告訴我AsyncTask正在執行什麼類型的函數嗎? (調用Web服務等)? – px3j 2012-03-16 21:34:51

+0

是它調用httpGet並返回我的網址陣列... – 2012-03-16 22:00:31

相關問題