簡體   English   中英

無法從onPostExecute調用方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM