2016-06-16 14 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に配列がnullではないということです。 OnPostExecuteを呼び出す前に配列を返すようです。それを解決するには?

+0

をbwのだろうことを覚えそれは仕事であり、結果をもたらしました。タスクを呼び出し、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 
} 

をしかし、応答があなたのAsyncTask完成する前にあなたは、おそらく値を取得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); 
    } 
    }; 
} 
関連する問題