2

我刚刚进入 android 开发,在尝试创建登录表单时遇到了一些问题。

我想要做的是输入用户名和密码并按登录,当按下登录按钮时,我希望它向我的服务器发出带有帐户信息的 JSON 请求,并获得是否允许用户登录的响应. 如果用户被允许,我想换一个新的视图。

我的代码正确接收 JSON 信息,但据我了解,UI 代码(推送新活动)应该在 onPostExecute() 中完成。我的问题是 onPostExecute 永远不会运行,我看过其他有同样问题的人,但他们的解决方案对我不起作用。他们所说的是我需要在 onPostExecute 之前有一个@Override,但是当我添加它时,我得到编译错误“该方法不会覆盖其超类中的方法”。

我也从有这个问题的人那里读过解决方案,从我读到的问题是 onPostExecute 方法必须具有与 doInBackground() 中的结果参数相同的参数。我的问题是我觉得我已经这样做了,当我尝试查看超类有什么(即 AsyncTask.java)时,它说 onPostExecute() 方法看起来像:

protected void onPostExecute(Result result) {
    }

但我不知道 Result 属于哪个类..

networkTask 使用这一行运行:

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

}
4

3 回答 3

8

在您的行中:

private class networkingTask extends AsyncTask

只需将其更改为:

private class networkingTask extends AsyncTask<String, Void, JSONObject>

whileString是您传递参数的地方,在您的情况下url,第二个参数Void用于显示进度,最后一个是要传递doInBackground到的处理结果onPostExecute

更多解释和信息,请参考Android 开发者:AsyncTask

于 2013-08-23T15:36:47.370 回答
3

我认为您可能需要为您的 AsyncTask 填写泛型类型。 请参阅 AsyncTask 文档中的“使用”部分。

您的类签名应如下所示:

private class networkingTask extends AsyncTask<Object, Void, JSONObject>

括号中的类型分别对应于、 和的参数类型doInBackground,如果您要重写这些方法以使其不同于通用方法签名,则它们是必需的。onProgressUpdateonPostExecute

此外,作为旁注,Java/Android 中的一个常见约定是使用大写的 CamelCase来启动类名。我还将您的课程名称更改为“NetworkingTask”,以帮助其他开发人员查看您的代码以更好地理解它。

于 2013-08-23T15:37:32.310 回答
1

签名不匹配。您正在尝试覆盖:

protected void onPostExecute(Result result)

与签名

protected void onPostExecute(JSONObject result)

...在超类中不存在。

于 2013-08-23T15:36:46.560 回答