【问题标题】:Saving Data to SharedPreferences inside "doInBackground"将数据保存到“doInBackground”中的 SharedPreferences
【发布时间】:2014-08-22 22:57:42
【问题描述】:

我想将一些数据保存到 AsyncTask 内的 SharedPreferences,我用谷歌搜索它并按照此处的其他一些答案,但我似乎无法让它正常工作。

 public class NtmLoadingTask extends AsyncTask<Void, Void, Void> {


    ArrayList<String> arr_dataNtmTitles = new ArrayList<String>();
    ArrayList<String> arr_dataNtmDates = new ArrayList<String>();
    ArrayList<String> arr_dataNtmContents = new ArrayList<String>();

 public NtmLoadingTask(Context applicationContext) {
}

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }

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

        Document docNTM;
        try {
            Connection.Response response = Jsoup.connect("http://omitted")
                    .timeout(10000)
                    .ignoreHttpErrors(true)
                    .execute();

            int statusCode = response.statusCode();
            if (statusCode == 200) {

                docNTM = Jsoup.connect("http://omitted").timeout(10000).get();

                Elements tableRows;
                tableRows = docNTM.select("table[title= TABLE]");

                //Get the Notices to Mariners Amount
                Element ntmNumber = tableRows.select("td:eq(0)").last();
                String ntmAmt = ntmNumber.text();

                //In-case Data does not exist...
                if (tableRows != null) {//Exists...

                    //Convert Ntm Number to int for Gathering the Ntm List
                    int ntmInt = Integer.parseInt(ntmAmt);
                    for (int i = 0; i < ntmInt; i++) {

                        //Get Ntm Titles
                        Elements titles = tableRows.select("td:eq(1)");
                        String ntmTitle = titles.get(i).text() + "\n";
                        arr_dataNtmTitles.add(ntmTitle);


                        //Get Ntm Dates
                        Elements dates = tableRows.select("td:eq(2)");
                        String ntmDates = dates.get(i).text() + "\n";
                        arr_dataNtmDates.add(ntmDates);

                        //Get Ntm Content
                        Elements contents = tableRows.select("td:eq(3)");
                        String ntmContent = contents.get(i).text() + "\n";
                        arr_dataNtmContents.add(ntmContent);


*****THIS IS WHERE I WOULD LIKE TO SAVE THE DATA SO AS ONCE THIS TASK HAS COMPLETED 
             I CAN USE IT IN ANOTHER ACTIVITY**********************


                     };

                } else {
                    System.out.println("No Data : " + statusCode );
                }
            } else {
                System.out.println("Received error code " + statusCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Received timeout error code);
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void params){

    System.out.println("NTM Content Captured and Saved");

       }
 }

当应用程序正在加载时,我在另一个活动中使用 Sharedpreferences,并且我了解如何在正常活动中使用它,但是尝试在此处保存任何内容时会引发大量错误或空指针。

那么我应该访问已经在调用此 asyncTask 的加载活动中创建的共享首选项文件,还是在 doinbackground 内创建一个新的共享首选项文件?

谢谢

还有我在加载活动中创建的共享首选项:

//Created
public static final String APP_DATA = "AppData";
SharedPreferences DATA;
SharedPreferences.Editor Editor;

//Usage
DATA = getSharedPreferences(APP_DATA, MODE_PRIVATE);
Editor = DATA.edit();

Editor.clear();
            Editor.putString("HomePort", selectedItem);//save name
            Editor.apply();
            Editor.commit();

【问题讨论】:

  • 我建议您将最终数据保存在 AsyncTask 的 `onPostExecute" 中
  • 你为什么在共享首选项对象上同时调用apply()commit()?显然这不是正确的用法......只需使用apply()
  • 在 postExecute 方法上保存或读取一些值,在 UI 主线程上执行,并且可以阻塞 UI,SharedPreference 的工作大部分在后台执行。
  • 您可以从任何活动中访问您的共享首选项:请参阅stackoverflow.com/questions/6186123/…
  • 您好,感谢您的意见。 @deadfish 是的,我已经在其他示例中看到了这一点,但是我将如何实现呢?因为这就是我要问的,这让我想到了“user3487063”评论,因为这不是正常的活动,我该如何访问它?谢谢

标签: java android android-asynctask sharedpreferences


【解决方案1】:

我相信我没有正确传递上下文,对我来说正确的方法如下:

public class NtmLoadingTask extends AsyncTask<Void, Void, Void> {

public static final String APP_DATA = "AppData";
SharedPreferences DATA;
SharedPreferences.Editor Editor;

ArrayList<String> arr_dataNtmTitles = new ArrayList<String>();
ArrayList<String> arr_dataNtmDates = new ArrayList<String>();
ArrayList<String> arr_dataNtmContents = new ArrayList<String>();

public NtmLoadingTask(Context context) {

这是我错了,我没有正确传递上下文

    DATA = context.getSharedPreferences(APP_DATA, Context.MODE_PRIVATE);
    Editor = DATA.edit();

}

@Override
protected void onPreExecute() {
    super.onPreExecute();

}

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

我现在也将数据保存在onPostExecute

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2019-09-23
    • 2016-11-15
    相关资源
    最近更新 更多