未保存SharedPreferences

时间:2019-02-18 06:36:19

标签: java android android-asynctask

因此,我一直在尝试寻找一种方法来保存从API中获得的访问令牌。我可以从API成功获取JSON响应,并将其存储在result中的doInBackground变量中。

但是,由于某种原因,它没有保存在我的onPostExecute的SharedPreferences中。

result变量包含此JSON字符串{"access_token":"4Oq6o8oAGRf4oflu3hrbsy18qeIfG1","expires_in":36000,"token_type":"Bearer","scope":"read write","refresh_token":"iocSNJ2PTVbph2RnWmcf0Zv69PDKjw"},该字符串是我从API收到的。

我有一种算法,目前应该只保存access_token

我的代码如下:

WSAdapter.java

public class WSAdapter {
    static public class SendAPIRequests extends AsyncTask<String, String, String> {
        // Add a pre-execute thing

        SharedPreferences ShPreference;
        SharedPreferences.Editor PrefEditor;
        static String MyPREFERENCES = "API Authentication";
        String accessToken = "Access Token";

        private WeakReference<Context> mLoginReference;

        // constructor
        public SendAPIRequests(Context context){
            mLoginReference = new WeakReference<>(context);
        }

        @Override
        protected String doInBackground(String... params) {
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

            Log.e("TAG", params[0]);
            Log.e("TAG", params[1]);
            //String data = "";

            StringBuilder result = new StringBuilder();

            HttpURLConnection httpURLConnection = null;
            try {

                // Sets up connection to the URL (params[0] from .execute in "login")
                httpURLConnection = (HttpURLConnection) new URL(params[2]).openConnection();

                // Sets the request method for the URL
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
                httpURLConnection.setRequestProperty("Accept","application/json");

                // Tells the URL that I am sending a POST request body
                httpURLConnection.setDoOutput(true);
                // Tells the URL that I want to read the response data
                httpURLConnection.setDoInput(true);

                // JSON object for the REST API
                JSONObject jsonParam = new JSONObject();
                jsonParam.put("client_id", "mYIHBd321Et3sgn7DqB8urnyrMDwzDeIJxd8eCCE");
                jsonParam.put("client_secret", "qkFYdlvikU4kfhSMBoLNsGleS2HNVHcPqaspCDR0Wdrdex5dHyiFHPXctedNjugnoTq8Ayx7D3v1C1pHeqyPh1BjRlBTQiJYSuH6pi9EVeuyjovxacauGVeGdsBOkHI3");
                jsonParam.put("username", params[0]);
                jsonParam.put("password", params[1]);
                jsonParam.put("grant_type", "password");

                Log.i("JSON", jsonParam.toString());

                // To write primitive Java data types to an output stream in a portable way
                DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());
                // Writes out a byte to the underlying output stream of the data posted from .execute function
                wr.writeBytes(jsonParam.toString());
                // Flushes the jsonParam to the output stream
                wr.flush();
                wr.close();

                // // Representing the input stream
                InputStream in = new BufferedInputStream(httpURLConnection.getInputStream());

                BufferedReader reader = new BufferedReader(new InputStreamReader(in));

                // reading the input stream / response from the url
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // Disconnects socket after using
                if (httpURLConnection != null) {
                    httpURLConnection.disconnect();
                }
            }

            Log.e("TAG", result.toString());
            return result.toString();
        }

        @Override
        protected void onPostExecute(String result) {
            //super.onPostExecute(result);
            // expecting a response code fro my server upon receiving the POST data
            Log.e("TAG", result);

            // retrieves the context passed
            Context context = mLoginReference.get();

            ShPreference = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

            // edits shared preferences for authentication and authorization
            PrefEditor = ShPreference.edit();

            // to save the Access Token from the API
            try {
                JSONObject pJObject = new JSONObject(result);

            PrefEditor.putString(accessToken, pJObject.getString("access_token"));
            PrefEditor.apply();
            // algorithm for parsing the JSONArray from the Django REST API
            /*for (int i = 0; i < pJObjArray.length(); i++) {
                // puts the current iterated JSON object from the array to another temporary object
                JSONObject pJObj_data = pJObjArray.getJSONObject(i);
                PrefEditor.putString(accessToken, pJObj_data.getString("access_token"));
                PrefEditor.apply();
            }*/

            } catch (JSONException e) {
                //Toast.makeText(JSonActivity.this, e.toString(), Toast.LENGTH_LONG).show();
                Log.d("Json","Exception = "+e.toString());
            }
        }
    }

下面的代码包含读取SharedPreferences的代码。哪个应该在此AsyncTask的doInBackground中,因为我需要将access_token放在标题中。

应该在同一个班上。

public class SendPostsRequest extends AsyncTask<String, String, String> {
        TextView postsSect;
        // Add a pre-execute thing
        HttpURLConnection urlConnection;

        // gets the activity context
        private WeakReference<Context> mPostReference;
        // to be able to access activity resources
        Activity activity;

        SharedPreferences ShPreference;
        SharedPreferences.Editor PrefEditor;
        String accessToken = "Access Token";

        // constructor
        public SendPostsRequest(Context context, Activity activity){
            mPostReference = new WeakReference<>(context);
            this.activity = activity;
        }

        @Override
        protected String doInBackground(String... params) {

            StringBuilder result = new StringBuilder();

            // retrieves the context passed
            Context context = mPostReference.get();

            ShPreference = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

            String APIAuthentication = "Bearer " + ShPreference.getString(accessToken, "");

            try {
                // Sets up connection to the URL (params[0] from .execute in "login")
                urlConnection = (HttpURLConnection) new URL(params[0]).openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setRequestProperty ("Authorization", APIAuthentication);
                urlConnection.connect();

                InputStream in = new BufferedInputStream(urlConnection.getInputStream());

                BufferedReader reader = new BufferedReader(new InputStreamReader(in));

                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }

            }catch( Exception e) {
                e.printStackTrace();
            }
            finally {
                urlConnection.disconnect();
            }

            return result.toString();
        }

        @Override
        protected void onPostExecute(String result) {

            // expecting a response code fro my server upon receiving the POST data
            Log.e("TAG", result);

            // gets the JSON files stored in the posts details class from Posts Activity
            Posts.PostsDetails postsHelper = new Posts().new PostsDetails();

            // retrieves the context passed
            Context context = mPostReference.get();

            // For posts
            try {
                JSONArray pJObjArray = new JSONArray(result);

                // algorithm for parsing the JSONArray from the Django REST API
                for (int i = 0; i < pJObjArray.length(); i++) {
                    // puts the current iterated JSON object from the array to another temporary object
                    JSONObject pJObj_data = pJObjArray.getJSONObject(i);
                    // inputs necesarry elements to the ListPosts function
                    postsHelper.setPost(pJObj_data.getInt("id"), pJObj_data.getString("post_title"), pJObj_data.getString("post_content"));
                }

            } catch (JSONException e) {
                //Toast.makeText(JSonActivity.this, e.toString(), Toast.LENGTH_LONG).show();
                Log.d("Json","Exception = "+e.toString());
            }

            // checks if context is not null before updating posts page
            if (context != null){
                postsSect = (TextView) activity.findViewById(R.id.PostsSection);


                int lastFrJSONArray = postsHelper.getPostID().size() - 1;

                // outputs the id of the very first post, something to put to the textview
                postsSect.setText("id: " + postsHelper.getPostID().get(lastFrJSONArray - 2) + "\n");
                for (int i = lastFrJSONArray; i >= 0; i--)
                {
                    // appending the titles and contents of the current post
                    postsSect.append("title: " + postsHelper.getPostTitle().get(i) + "\n");
                    postsSect.append("content: " + postsHelper.getPostContent().get(i) + "\n");

                    // if this is the last post, then don't need to append id for the next post.
                    if (i != 0) {
                        postsSect.append("id: " + postsHelper.getPostID().get(i) + "\n");
                    }
                }
            }

        }

    }

更新:

我已经编辑了JSON解析算法。

现在,此代码不再将result中的JSON对象解析为数组,而是将其解析为对象。应当将JSONarray算法注释掉。

2 个答案:

答案 0 :(得分:0)

您从Web服务获得的响应实际上不是JSONArray,而是简单的JSONObject。因此更改此行:

JSONArray pJObjArray = new JSONArray(result);

JSONObject pJObjArray = new JSONObject(result);

答案 1 :(得分:0)

如果您没有获得令牌,请遵循以下代码。它可能会帮助您。

    //member variable
    SharedPreferences ShPreference;
    SharedPreferences.Editor PrefEditor;
    String ApiToken;

    OnCreate(){

   ShPreference = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    ApiToken =  ShPreference.getString(accessToken, "");

    //  call wherever you want
    new SendPostsRequest(ApiToken).execute()

    }



  public class SendPostsRequest extends AsyncTask<String, String, String> {
    private String APIToken;
    TextView postsSect;
    // Add a pre-execute thing
    HttpURLConnection urlConnection;

    // gets the activity context


    // constructor
    public SendPostsRequest(String APIToken){
        this.APIToken = APIToken;
    }

    @Override
    protected String doInBackground(String... params) {

        StringBuilder result = new StringBuilder();

        // retrieves the context passed
        Context context = mPostReference.get();

        String APIAuthentication = APIToken; // or you can direct pass

        try {
            // Sets up connection to the URL (params[0] from .execute in "login")
            urlConnection = (HttpURLConnection) new URL(params[0]).openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setRequestProperty ("Authorization", APIAuthentication);
            urlConnection.connect();

            InputStream in = new BufferedInputStream(urlConnection.getInputStream());

            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }

        }catch( Exception e) {
            e.printStackTrace();
        }
        finally {
            urlConnection.disconnect();
        }

        return result.toString();
    }

    @Override
    protected void onPostExecute(String result) {

        // expecting a response code fro my server upon receiving the POST data
        Log.e("TAG", result);

        // gets the JSON files stored in the posts details class from Posts Activity
        Posts.PostsDetails postsHelper = new Posts().new PostsDetails();

        // retrieves the context passed
        Context context = mPostReference.get();

        // For posts
        try {
            JSONArray pJObjArray = new JSONArray(result);

            // algorithm for parsing the JSONArray from the Django REST API
            for (int i = 0; i < pJObjArray.length(); i++) {
                // puts the current iterated JSON object from the array to another temporary object
                JSONObject pJObj_data = pJObjArray.getJSONObject(i);
                // inputs necesarry elements to the ListPosts function
                postsHelper.setPost(pJObj_data.getInt("id"), pJObj_data.getString("post_title"), pJObj_data.getString("post_content"));
            }

        } catch (JSONException e) {
            //Toast.makeText(JSonActivity.this, e.toString(), Toast.LENGTH_LONG).show();
            Log.d("Json","Exception = "+e.toString());
        }

        // checks if context is not null before updating posts page
        if (context != null){
            postsSect = (TextView) activity.findViewById(R.id.PostsSection);


            int lastFrJSONArray = postsHelper.getPostID().size() - 1;

            // outputs the id of the very first post, something to put to the textview
            postsSect.setText("id: " + postsHelper.getPostID().get(lastFrJSONArray - 2) + "\n");
            for (int i = lastFrJSONArray; i >= 0; i--)
            {
                // appending the titles and contents of the current post
                postsSect.append("title: " + postsHelper.getPostTitle().get(i) + "\n");
                postsSect.append("content: " + postsHelper.getPostContent().get(i) + "\n");

                // if this is the last post, then don't need to append id for the next post.
                if (i != 0) {
                    postsSect.append("id: " + postsHelper.getPostID().get(i) + "\n");
                }
            }
        }

    }

}