onPostExecute没有运行,@ override不能用于android开发

时间:2013-08-23 15:29:12

标签: java android android-asynctask

我刚刚进入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;
    }

}

3 个答案:

答案 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>

此处括号中的类型分别对应doInBackgroundonProgressUpdateonPostExecute的参数类型,如果您要覆盖这些方法,则必须使用它们与通用方法签名不同。

另外,作为旁注,使用upper CamelCase来启动类名是Java / Android中的常见惯例。我还将您的类名称更改为“NetworkingTask”,以帮助其他开发人员查看您的代码以更好地理解它。

答案 2 :(得分:1)

签名不匹配。你试图覆盖:

protected void onPostExecute(Result result)
带签名的

protected void onPostExecute(JSONObject result)

...超类中不存在。