2016-03-20 77 views
1

因此,我是新來的,我需要調用將從單獨的文件運行AsyncTask的函數。如何在AsyncTask doInBackground不運行,但在第二次它運行

MainActivity.java代碼

public class MainActivity extends AppCompatActivity { 
String res; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Asynctasktest newAsy = new Asynctasktest(); 



    res = newAsy.ValidateUser(); 

    Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show(); 
} 

} 

和AsyncTaskTest.java代碼

public class Asynctasktest extends MainActivity { 

String Res; 

private class GetFWork extends AsyncTask<Void,Void,String> { 

    @Override 
    protected void onPreExecute() { 
     Res = "onPreExecute"; 
    } 

    @Override 
    protected String doInBackground(Void... param) { 

     return "am i here"; 
    } 

    @Override 
    protected void onPostExecute(String Result) { 
     super.onPostExecute(Result); 
     Res = Result; 
    } 
} 

public String ValidateUser(){ 

    final GetFWork Fl = new GetFWork(); 

    Fl.execute(); 

    return Res; 
} 


} 

所以我需要得到文本 「我在這裏」,但我得到 「onPreExecute」,這表明上首先稱它不做doInBackground。

+0

這是一個非常原始的方式來跟蹤你的應用程序發生的事情。使用'Log'或簡單地用斷點調試。 – Vucko

+0

第一個電話應該打到doInBackground(..)'。在'doInBackground(..)'的開頭添加'android.os.Debug.waitForDebugger();'放置一個斷點,看它是否到達該函數。 –

+0

AsyncTask的全部目的是它是「異步」的。你不能執行()它,並期望在下一行代碼中有結果。 – Egor

回答

1

這是AsyncTask的工作原理。

res = newAsy.ValidateUser(); 
Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show(); 

在同一時間都執行,因而 - 自的AsyncTask是異步 - RE的值仍然是「onPreExecute」。

0

Wukash提出的優點。只是爲了闡述。當ValidateUser()返回Res時,不能保證AsyncTask已完成運行,因爲它是異步的並且運行在主線程之外。因此,在你的情況下,它返回null,因爲Res從未得到更新。

如果您需要返回值result以更新UI或其他內容,請發送處理函數引用作爲回調,並使其工作。

請讓我知道你是否需要一些進一步的解釋。我記得當我第一次實施AysncTask時有過類似的問題。

+0

有大量資源可用於設置回調。 [這是我遵循的一個很好的](http://stackoverflow.com/questions/9963691/android-asynctask-sending-callbacks-to-ui)。 –

+0

我使用了這個例子,並讓它在我的測試中工作。所以我需要使用Asynctask對php進行不同的調用,我將不得不通過一些參數,然後像在OnPreExecute中構建鏈接,並在doInBackground上執行httpurlconnection調用並等待答案。或者有更好的辦法呢? –

+0

@IvarsAkmentins我認爲你在那裏很不錯。可能還會將鏈接建立到doInBackground,因爲您並不需要它同步發生。一個體面的面向對象方法可以是實例化一個Asynctasktest對象,初始化一些你需要的鏈接構建參數,並將所有東西卸載到doInBackground。這將導致一個非常堅實的設計。 –

0

嘗試調用超在這種方法

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    Res = "onPreExecute"; 
} 

還請記住,你不能調用相同的AsyncTask對象兩次,否則你會得到這個錯誤:

Cannot execute task: the task has already been executed (a task can be executed only once) 

所以你有辦法你的ValidateUser()方法創建一個新的GetFWork()是很好的。

相關問題