我已经尝试了所有的东西,但是没有用。
我正在试着打电话给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;
}
}
提前致谢!
答案 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;
}