AsyncTask:不调用onPostExecute()

时间:2017-10-03 11:20:39

标签: android api android-asynctask

我已经尝试了所有的东西,但是没有用。

我正在试着打电话给Api。但是,onPostExecute()不会被调用,这使得我的回调不起作用。

这是我的AsyncTask类:

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的地方:

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;
    }
}

提前致谢!

3 个答案:

答案 0 :(得分:1)

来自官方Android开发者网站:

  

此类必须遵循一些线程规则   正常工作:

     
      
  • 必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。
  •   
  • 必须在UI线程上创建任务实例。
  •   必须在UI线程上调用
  • execute(Params ...)。
  •   
  • 不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。   该任务只能执行一次(如果尝试第二次执行则会抛出异常。)
  •   

我会强调第3个子弹。必须在 UI 主题上调用execute。在您的代码中,它显示从execute方法调用getString(),但不清楚此方法是否存在于属于UI线程的类中,例如一个活动。我想没有可以执行onPostExecute方法的UI线程。

答案 1 :(得分:0)

也许你在doInBackground()方法中有另一个例外。将此catch块添加到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()
}

答案 2 :(得分:0)

您的网络调用中可能会有一个异常被返回,因此返回null作为结果。同时您返回结果尝试并再次发送null作为结果在被覆盖的方法结束时。所以改变你的像这样的代码

 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;
    }