2017-10-03 19 views
0

私はすべてを試しましたが、nothingsは機能します。AsyncTask:onPostExecute()は呼び出されません

私は、動作するApiを呼び出そうとしています。しかし、onPostExecute()は呼び出されないため、コールバックが機能しません。

class RetrieveInput extends AsyncTask<String, String, String> { 

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

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      URL url = new URL(params[0]); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("GET"); 
      InputStream stream = connection.getInputStream(); 
      Scanner s = new Scanner(stream).useDelimiter("\\A"); 
      String result = s.hasNext() ? s.next() : ""; 
      return result; 
     } catch (IOException ex) { 
      Log.d("Error", "Error fetching data"); 
      Log.d("STACKTRACE", ex.getStackTrace().toString()); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     repo.setString(result); 
    } 
} 

これはAsyncTaskが呼び出されるところである:

この

は私のAsyncTaskクラスです

public void getString() { 
    if (url != null) { 
     RetrieveInput input = new RetrieveInput(); 
     input.execute(url); 
    } 
} 

これは私のコールバックが配置されている場所です。事前に

public class UserRepository implements IRepository { 

    private Connection connection; 
    private String result; 
    private Gson gson; 

    public UserRepository() { 
     this.connection = new Connection(this); 
     this.gson = new Gson(); 
    } 

    public User find(String userName) { 
     connection.setUrl("http://10.0.2.2:8080/api-0.1.0/users/get/" + userName); 
     connection.getString(); 
     User user = gson.fromJson(this.result, User.class); 
     return user; 
    } 

    @Override 
    public void setString(String result) { 
     this.result = result; 
    } 
} 

感謝を!

+0

を実行すると、InBackground()が呼び出されるか、そうでない場合もありますか? – Kriti

+0

それが呼び出されます!結果の文字列にJSON –

+0

が含まれている可能性があります。 'connection.setConnectTimeout(10000);'を使って、関数が常に返ることを確認してください。また、 'doInBackground'メソッドの異なる行にブレークポイントを置くことによって、あなたのアプリケーションをデバッグしてみてください。 –

答えて

0

たぶん、あなたはdoInBackground()方法あなたのtryキャッチにこのcatchブロックを追加するには、別の例外があります。

catch (Exception ex) { 
    ex.getStackTrace() 
} 

ともあなたのログを確認し、あなたが持つことになりますので、あなたのログ行がlogcat
に印刷されていないことを確認してくださいこの:

try { 
    URL url = new URL(params[0]); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestMethod("GET"); 
    InputStream stream = connection.getInputStream(); 
    Scanner s = new Scanner(stream).useDelimiter("\\A"); 
    String result = s.hasNext() ? s.next() : ""; 
    return result; 
}catch (IOException ex) { 
    Log.d("Error", "Error fetching data"); 
    Log.d("STACKTRACE", ex.getStackTrace().toString()); 
} catch (Exception ex) { 
    ex.getStackTrace() 
} 
+0

ありがとうございますが、例外はありません。 –

0

返さので、ヌルされ、ネットワークの呼び出しで例外があるかもしれませんが、あなたが試しに結果を返すと、再び専用で、結果としてnullを送信しているresult.Alsoとして送信されます公式のAndroidデベロッパーサイトからこの

String dataResult = null; 
    try { 
     URL url = new URL(params[0]); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     InputStream stream = connection.getInputStream(); 
     Scanner s = new Scanner(stream).useDelimiter("\\A"); 
     String result = s.hasNext() ? s.next() : ""; 
     dataResult = result; 
    } catch (IOException ex) { 
     Log.d("Error", "Error fetching data"); 
     Log.d("STACKTRACE", ex.getStackTrace().toString()); 
    } finally { 
     return dataResult; 
    } 
+0

ありがとうございますが、残念ながら助けにはなりません! –

+0

ああ、私はあなたがサーバから結果をオーバーライドしていたと推測した。 – Anonymous

1

のようにコードを変更overridden.So取得する方法のD:

動作するように、このクラス のために従わなければならないいくつかのスレッドのルールがあります。正しく:

  • AsyncTaskクラスは、UIスレッドにロードする必要があります。これはJELLY_BEANの時点で自動的に行われます。
  • タスク・インスタンスは、UIスレッドで作成する必要があります。
  • UIスレッドでexecute(Params ...)を呼び出す必要があります。
  • onPreExecute()、onPostExecute(Result)、doInBackground(Params ...)、onProgressUpdate(Progress ...)を手動で呼び出さないでください。 タスクを実行することができ、一度だけ(第2の実行が試行された場合、例外がスローされます。)

私は3番目の弾丸を重視でしょう。 UIスレッドでexecuteを呼び出す必要があります。あなたのコードでは、getString()メソッドからexecuteが呼び出されたことを示していますが、このメソッドがUIスレッドに属するクラスに存在するかどうかは不明です。アクティビティ私はonPostExecuteメソッドを実行できるUIスレッドがないと仮定します。

+0

こんにちは、このメソッドはConnectionというクラスに属しています。これはアクティビティではありませんが、リポジトリで作成され、リポジトリはアクティビティで作成されます。だから私はUIのスレッドの右にする必要がありますか? –

+0

Yeap、アクティビティで作成して呼び出す必要があります。弾丸2と3を参照 – pleft

+0

@pleftはrunOnUiThreadの動作になりますか? –

関連する問題