我刚刚进入android开发阶段,在尝试创建登录表单时遇到了一些问题。
我想要做的是输入用户名和密码并按登录,当按下登录按钮时,我希望它向我的服务器发送带有帐户信息的JSON请求,并获得是否允许用户的回复登录。如果允许用户,我想更改为新视图。
我的代码正确地接收了JSON信息,但是从我所理解的UI代码(推动新活动)应该在onPostExecute()中完成。我的问题是onPostExecute永远不会运行,我已经看过其他ppl有同样的问题,但他们的解决方案对我没用。他们所说的是我需要在onPostExecute之前有一个@Override,但是当我添加它时,我得到编译错误“该方法不会覆盖其超类的方法”。
我已经阅读过那些遇到这个问题的人的解决方案,从我读过的问题来看,onPostExecute方法必须与doInBackground()的result参数具有相同的参数。我的问题是我觉得我已经做了,当我试图查看超类的内容(即AsyncTask.java)时,它说onPostExecute()方法如下:
protected void onPostExecute(Result result) {
}
但我不知道结果属于哪个类..
使用此行运行networkingTask:
new networkingTask().execute(url);
如果有人能帮助我,我将永远感激不尽! :)
这是我的代码看起来像
private class networkingTask extends AsyncTask {
Context context;
private networkingTask(Context context) {
this.context = context.getApplicationContext();
}
public networkingTask() {
}
@Override
protected JSONObject doInBackground(Object... params) {
try {
String urlString = (String) params[0];
System.out.println(urlString);
// Creating JSON Parser instance
JSONParser jParser = new JSONParser();
// getting JSON string from URL
JSONObject json;
json = jParser.getJSONFromUrl(urlString);
String responseLogged = json.getString("logged");
System.out.println("can we log in?: "+ responseLogged);
return json;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(JSONObject result) {
String responseLogged = "";
try {
responseLogged = result.getString("logged");
} catch (JSONException e) {
e.printStackTrace();
}
if(responseLogged.equals("true")){ //Login = true
Intent intent = new Intent(context, ShowListActivity.class);
intent.putExtra(EXTRA_JSON_OBJECT, result.toString());
startActivity(intent);
} else{ //Login = false
System.out.println("wrong password");
}
return;
}
}
答案 0 :(得分:8)
在你的行中:
private class networkingTask extends AsyncTask
只需将其更改为:
private class networkingTask extends AsyncTask<String, Void, JSONObject>
虽然String
是您传递参数的地方,但在您的情况下是url
,第二个参数Void
用于显示进度,最后一个用于处理结果将从doInBackground
传递到onPostExecute
进一步解释&amp;有关信息,请参阅Android Developers: AsyncTask
答案 1 :(得分:3)
我认为您可能需要填写AsyncTask的泛型类型。 See the "Usage" section in the AsyncTask documentation.
您的班级签名应如下所示:
private class networkingTask extends AsyncTask<Object, Void, JSONObject>
此处括号中的类型分别对应doInBackground
,onProgressUpdate
和onPostExecute
的参数类型,如果您要覆盖这些方法,则必须使用它们与通用方法签名不同。
另外,作为旁注,使用upper CamelCase来启动类名是Java / Android中的常见惯例。我还将您的类名称更改为“NetworkingTask”,以帮助其他开发人员查看您的代码以更好地理解它。
答案 2 :(得分:1)
签名不匹配。你试图覆盖:
protected void onPostExecute(Result result)
带签名的
protected void onPostExecute(JSONObject result)
...超类中不存在。