2011-08-22 151 views
5

我有一個方法hostPhoto();它基本上將圖像上傳到網站並檢索鏈接。 然後我有其他方法將鏈接發佈到網站。Android如何在繼續之前等待代碼完成

現在使用這種方法的方式即時通訊」是這樣的:

String link = hostPhoto(); //returns a link in string format 

post(text+" "+link); // posts the text + a link. 

我的問題是...是,hostPhoto()需要幾秒鐘,以上傳和檢索鏈接, 我的程序似乎不等待並繼續張貼,因此即時通訊留下的鏈接爲空,

是否有無論如何,我可以讓它首先得到鏈接...然後發佈? 像某種onComplete?或類似的東西.. 我認爲我的方法上面會工作,但通過做Log.i的似乎鏈接後返回到一秒左右的字符串。

更新:這是我的問題的更新進度,即時使用AsyncTask作爲通知,但Log.i的錯誤顯示urlLink爲空...這意味着從hostphoto請求的鏈接永遠不會回到銀泰爲日誌..

更新2:最後的作品!問題是hostPhoto()中的線程,有人能提供給我一個探索爲什麼這個線程會造成這種情況嗎? 感謝所有回覆的人。

private class myAsyncTask extends AsyncTask<Void, Void, Void> { 
    String urlLink; 
    String text; 
    public myAsyncTask(String txt){ 

     text=txt; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     urlLink=hostPhoto(); 
     //Log.i("Linked", urlLink); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     try { 
      Log.i("Adding to status", urlLink); 
      mLin.updateStatus(text+" "+urlLink); 
      Log.i("Status:", urlLink); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

hostPhoto()做到這一點:

  String link; new Thread(){ 

       @Override 
       public void run(){ 
        HostPhoto photo = new HostPhoto(); //create the host class 


        link= photo.post(filepath); // upload the photo and return the link 
        Log.i("link:",link); 
       } 
      }.start(); 
+0

封裝你應該張貼更多的代碼,尤其是因爲你描述的行爲是非標準的,所以'hostPhoto()'的內容。 –

+0

'AsyncTask'不能解決這個問題,因爲'hostPhoto()'甚至不會阻塞該線程。像提到的atc一樣,你需要從'hostPhoto()'發佈代碼。 –

+0

hostPhoto的代碼已更新 – asd2005

回答

8

可以使用的AsyncTask這裏,

AsyncTask

使用,你可以在doInBackground執行的

hostPhoto()

()的代碼,然後執行的

代碼

post(text+" "+link);

onPostExecute()方法,這將爲您提供最佳解決方案。

你可以把代碼寫在這個模式

private class MyAsyncTask extends AsyncTask<Void, Void, Void> 
{ 
    @Override 
    protected Void doInBackground(Void... params) { 
     hostPhoto(); 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     post(text+" "+link); 
    } 
} 

和可利用執行它

new MyAsyncTask().execute(); 
+0

嘿,謝謝你的回覆。 執行你的方法後,我得到一個error.Check出hte更新的問題上面 – asd2005

+0

最後的作品!問題是hostPhoto()中的線程,有人能提供給我一個探索爲什麼這個線程會造成這種情況嗎? – asd2005

2

我使用一個單獨的線程異步地完成這個動作假設你是(或者應該是)。

您需要將post()放置在hostPhoto()完成時調用的回調中。

一般我做這個用AsyncTask與Android ...

此爲您提供的回調onPostExecute(),你可以做你的post()內。

0

你的第二個問題:

可能有人給我一個解釋,爲什麼那個線程會有 引起這個?

您致電「link = photo.post(filepath);」這是在一個新的線程上運行。 雖然該方法仍在運行,但鏈接仍爲空,並且當前線程(主線程)繼續以該鏈接運行(當時爲null)

在這種情況下,您需要等待結果讓新線程運行的方法,並在完成後,該線程將要求主線程更新結果(通過一些回調或處理程序),所有這些工作都深受Android AsyncTask

相關問題