2

私はアンドロイド開発を始めたばかりで、ログインフォームを作成しようとしているときにいくつかの問題に遭遇しました。

私がしたいのは、ユーザー名とパスワードを入力してログインを押すことです。ログインボタンが押されたら、サーバーへのアカウント情報を使用して JSON 要求を実行し、ユーザーがログインを許可されているかどうかの応答を取得します。 . ユーザーが許可されている場合は、新しいビューに変更したい。

私のコードは JSON 情報を正しく受け取りますが、UI コード (新しいアクティビティのプッシュ) は onPostExecute() で行う必要があることを理解しました。私の問題は、 onPostExecute が実行されないことです。同じ問題を抱えている他の ppl を見てきましたが、彼らの解決策はうまくいきませんでした。彼らが言ったことは、onPostExecuteの前に@Overrideが必要だということですが、それを追加すると、「メソッドはスーパークラスのメソッドをオーバーライドしません」というコンパイルエラーが発生します。

私はその問題を抱えている人々からの解決策も読みました。私が読んだ問題から、メソッド onPostExecute は doInBackground() からの結果パラメーターと同じパラメーターを持つ必要があるということです。私の問題は、私がすでにやっていると感じていることです。スーパークラスが持っているもの (つまり、AsyncTask.java) を調べようとすると、メソッド onPostExecute() は次のようになります。

protected void onPostExecute(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。2 番目のパラメータは進行状況を表示するためのもので、最後のパラメータは からにVoid渡される処理された結果です。doInBackgroundonPostExecute

詳細な説明と情報については、 Android Developers: AsyncTaskを参照してください。

于 2013-08-23T15:36:47.370 に答える
3

AsyncTask のジェネリック型を記入する必要があるかもしれません。 AsyncTask ドキュメントの「使用方法」セクションを参照してください。

クラス署名は次のようになります。

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

ここで角括弧内の型は、それぞれ 、 、および の引数の型に対応しdoInBackgroundonProgressUpdateジェネリックonPostExecuteメソッド シグネチャとは異なるようにこれらのメソッドをオーバーライドする場合に必要です。

また、補足として、クラス名を開始するために上部のキャメルケースを使用することは、Java/Android の一般的な規則です。また、クラスの名前を「NetworkingTask」に変更して、コードを見ている他の開発者がコードをよりよく理解できるようにします。

于 2013-08-23T15:37:32.310 に答える
1

署名が一致しません。オーバーライドしようとしています:

protected void onPostExecute(Result result)

サイン入り

protected void onPostExecute(JSONObject result)

...スーパークラスには存在しません。

于 2013-08-23T15:36:46.560 に答える