2016-06-16 59 views
1

我嘗試使用該功能返回的對象數組:返回對象 - OnPostExecute

public static JSONEvent[] invokeFunction(String funName, String requestContent) { 

     final String functionName = funName; 
     final String requestPayload = requestContent; 

     new AsyncTask<Void, Void, InvokeResult>() { 
      @Override 
      protected InvokeResult doInBackground(Void... params) { 
       try { 
        final ByteBuffer payload = 
          ENCODER.encode(CharBuffer.wrap(requestPayload)); 

        final InvokeRequest invokeRequest = 
          new InvokeRequest() 
            .withFunctionName(functionName) 
            .withInvocationType(InvocationType.RequestResponse) 
            .withPayload(payload); 

        final InvokeResult invokeResult = 
          AWSMobileClient 
            .defaultMobileClient() 
            .getCloudFunctionClient() 
            .invoke(invokeRequest); 

        return invokeResult; 
       } catch (final Exception e) { 
        Log.e("LAMBDA", "AWS Lambda invocation failed : " + e.getMessage(), e); 
        final InvokeResult result = new InvokeResult(); 
        result.setStatusCode(500); 
        result.setFunctionError(e.getMessage()); 
        return result; 
       } 
      } 

      @Override 
      protected void onPostExecute(final InvokeResult invokeResult) { 

       try { 
        final int statusCode = invokeResult.getStatusCode(); 
        final String functionError = invokeResult.getFunctionError(); 
        final String logResult = invokeResult.getLogResult(); 

        if (statusCode != 200) { 
         //showError(invokeResult.getFunctionError()); 
        } else { 
         final ByteBuffer resultPayloadBuffer = invokeResult.getPayload(); 

         //resultPayloadBuffer.rewind(); 
//      while (resultPayloadBuffer.hasRemaining()) 
//       Log.e("BUFFER",resultPayloadBuffer.position() + " -> " + resultPayloadBuffer.get()); 

//      User a = new User(23, 24); 
// 
//      User b = new User(58, 59); 
//      User[] ab = new User[] {a, b}; 

         // User [] events = new User[3]; 

         ObjectMapper mapper = new ObjectMapper(); 





         final String resultPayload = DECODER.decode(resultPayloadBuffer).toString(); 
         Log.e("LAMBDA-SUCCESS", resultPayload); 
         try { 
          // String s2 = getJson2(ab); 
          // Log.e("S2", s2); 
          //User[] user2 = mapper.readValue(resultPayload, User[].class); 
          events = mapper.readValue(resultPayload, JSONEvent[].class); 

//       for (JSONEvent u : events) 
//        Log.e("USER",u.getLocationLat()+""); 

          Log.e("ARRAY",Arrays.toString(events)); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 

         //return resultPayload; 
         // mResultField.setText(resultPayload); 
        } 

        if (functionError != null) { 
         Log.e("LAMBDA", "AWS Lambda Function Error: " + functionError); 
        } 

        if (logResult != null) { 
         Log.d("LAMBDA", "AWS Lambda Log Result: " + logResult); 
        } 
       } 
       catch (final Exception e) { 
        Log.e("LAMBDA", "Unable to decode results. " + e.getMessage(), e); 
        //showError(e.getMessage()); 
       } 
      } 
     }.execute(); 

     return events; 
    } 

的問題是,我稱之爲invokeFunction在不同勢活動,並將其返回null但onPostExecute數組不爲空。看起來它在調用OnPostExecute之前返回數組。如何解決這個問題?

+0

你可能獲得價值這是工作和提供的結果。調用任務並使用onPostExecute的結果。例如在onPostExecute裏面,你可以調用另一個方法,比如updateUi(events)。只需在此方法內完成您需要的工作 –

+0

說實話,我試圖實施您的建議,但我不工作。你能幫我一些代碼嗎? –

回答

0

問題是方法invokeFunction正在完成之前onPostExecute(異步) 您可以使用一個接口來傳達AsyncTask和活動。

接口(僞):

public interface AsyncCom { 
    public void sendUsers(User [] events); 
} 

你asynFunction(pseucode):

public void invokeFunction(String funName, String requestContent, AsyncCom listener) { 
    ... 

,並調用監聽器的功能postExecute(僞):

protected void onPostExecute(final InvokeResult invokeResult) { 
    ... 

    listener.sendUsers(events); 

    } 

申報在你的活動中的接口,並用監聽器(僞代碼)調用你的方法:

public class MyActivity implements AsyncCom { 

    ... 

    invokeFunction(funName, requestContent, this); 

    ... 

最後,在您的活動,實現了恢復方法(僞):

public void sendUsers(User [] events){ 
    // do wathever you want with users 
} 

但reme​​ber的響應將在你的AsyncTask完成BW asynchonous

0
private void invokeFunction(String funName, String requestContent{ 
    YourTask task = new YourTask(); 
    task.execute(new String[]{funName, requestContent}); 
} 

static class YourTask extends AsyncTask<String, Void, InvokeResult> { 

    @Override 
    protected InvokeResult doInBackground(String... params) { 

     String funName = params[0]; 
     String requestContent = params[1]; 

     // ... 
    } 

    @Override 
    protected void onPostExecute(final InvokeResult invokeResult) { 

     /// . .. 
     doWhatYouNeedWithTheResult(result); 
    } 
    }; 
}