[英]Unable to call methods from onPostExecute
我正在使用異步任務來運行JSON下載器,如下所示:
public class JSONDownloader extends AsyncTask<Object, Object, Object>{
@Override
protected Object doInBackground(Object... params) {
if(JSONstate == false){
try {
final URL url = new URL([REDACTED]);
final URLConnection urlConnection = url.openConnection();
urlConnection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
urlConnection.connect();
final InputStream inputStream = urlConnection.getInputStream();
final StringBuilder sb = new StringBuilder();
while (inputStream.available() > 0) {
sb.append((char) inputStream.read());
}
String result = sb.toString();
JSONObject jsonOrg = new JSONObject(result);
String ok = "ok";
Response = jsonOrg.getString("response");
System.out.println(Response);
if(Response.equals(ok)){
Settingsresponse = true;
orgName = jsonOrg.getString("orgName");
System.out.println("orgName" + orgName);
accessPointName = jsonOrg.getString("attendanceRecorderName");
System.out.println("accessPointName" + accessPointName);
lat = jsonOrg.getString("latitude");
System.out.println("lat" + lat);
longi = jsonOrg.getString("longitude");
System.out.println("longi" + longi);
floor = jsonOrg.getString("floor");
System.out.println("floor" + floor);
orgId = jsonOrg.getString("orgId");
System.out.println("orgId" + orgId);
}
else{
System.out.println("Data sent was erroneous");
Settingsresponse = false;
}
} catch (Exception e) {
System.err.print(e);
}
}
else if(JSONstate == true){
try {
[redacted]
}
else{
System.out.println("Data sent was erroneous");
Settingsresponse = false;
}
} catch (Exception e) {
System.err.print(e);
}
}
return null;
}
protected void onPostExecute(Void result){
if(JSONstate == false){
System.out.println("This piece of code is definitely being run");
setfields();
}
else if(JSONstate == true){
settestfields();
//This method does not run upon the completion of the JSON request, as it supposedly should
}
}
}
JSONRequest完成后,'onPostExecute'方法將不會運行。 我一直在嘗試使用此方法,以便可以在請求完成后立即更新一組字段,而不必設置明確的等待時間。 我只是在使用代碼錯誤嗎? 還是我想念的東西?
您沒有為onPostExecute覆蓋正確的方法。
你有:
protected void onPostExecute(Void result)
你需要:
protected void onPostExecute(Object result)
注意,您提供的第三個通用參數是Object
類型。 那就是onPostExecute
用作參數的類型。 因此, onPostExecute
的方法簽名需要接受一個Object
,而不是Void
。
您可能應該在這里使用布爾值而不是對象的結果類型,並刪除Json狀態類變量。 這使您的AsyncTask更加靈活,並可以讓您在執行后向用戶顯示一些操作已完成的指示。
我不得不說,您在AsyncTask中編寫的代碼一點都不匹配。
AsyncTask被設計為從UI線程用盡的另一個線程。 因此,您應該將其用作正在運行的UI線程中的內部類,然后onPostExecute()部分可以執行某些操作以顯示結果,或者如果您將其保留為獨立類,則可以將其用作代碼。 您應該設計一個接口,運行新AsyncTask的其他類(如活動或片段)。execute()應該實現該接口。
另外,java不是javascript。 您在doInBackground()中的變量僅在函數中受到限制。 因此,您在onPostExecute()中所做的一切將一無所獲。
您應該使用
JSONObject jsonOrg
作為類變量,或者您應該在doInBackground()的末尾將其返回並在onPostExecute()中獲取它
畢竟,我建議您看一下api文檔的示例。 盡管它有點復雜,但它顯示出所有內容都是完美的。
嘗試使用替代方法
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.i("in on ", "entered");
hideProgress();
}
如william所建議,類型應與重寫方法匹配。 我在下面編輯了答案
public class JSONDownloader extends AsyncTask<Object, Object, Object>
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.