【问题标题】:Android AsyncTask, getting SharedPreferences, stuckAndroid AsyncTask,获取 SharedPreferences,卡住
【发布时间】:2015-10-22 20:55:25
【问题描述】:

我遇到了一个看起来很简单的问题。我看到很多关于我的问题的线程,但没有一个能帮助我。这是关于获得共享首选项..

问题是我想从doInBackground 方法中的计算得到结果,但我只是不知道如何使用方法getSharedPreferences

我的主要活动名为MainActivity。我还创建了新的Java Class,它应该在后台做一些事情。代码如下:

package com.example.pablo.zad3;

import android.content.SharedPreferences;
import android.os.AsyncTask;

public class Background extends AsyncTask<Integer,Void,String>{

    @Override
    protected String doInBackground(Integer... params) {
        Integer n = params[0];
        StringBuilder sb=new StringBuilder();
       for(int i=1;i<250;i++)
       {
           sb.append(i+ " ");
           sb.append(n*i+"\n");
       }
        return sb.toString();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        SharedPreferences prefs = //WHAT NOW??
    }
}

但是,显然有些东西我不明白,因为我不知道如何使用它。请提供一些适用于我的示例代码。

【问题讨论】:

    标签: java android android-studio android-asynctask


    【解决方案1】:

    您的代码需要修改如下:

    package com.example.pablo.zad3;
    
    import android.content.SharedPreferences;
    import android.content.Context;
    import android.os.AsyncTask;
    
    public class Background extends AsyncTask<Integer,Void,String>{
    
        private Context context;
    
        public Background(Context context) {
            this.context = context;
        }
    
        @Override
        protected String doInBackground(Integer... params) {
            Integer n = params[0];
            StringBuilder sb=new StringBuilder();
           for(int i=1;i<250;i++)
           {
               sb.append(i+ " ");
               sb.append(n*i+"\n");
           }
            return sb.toString();
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
    
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.context);
        }
    }
    

    根据您提出的问题(主要问题以及 cmets 中的问题),我猜您从未使用过 SharedPreferences。这是供您参考的链接。 http://developer.android.com/reference/android/content/SharedPreferences.html http://developer.android.com/training/basics/data-storage/shared-preferences.html http://www.pcsalt.com/android/storing-data-in-sharedpreferences-android/

    【讨论】:

    • 或者只是将SharedPreferences 对象传递给任务。它不需要整个上下文。
    • @TmKVU 你能解释一下吗?我是 Java/Android Studio 的新手,我真的不知道该怎么做。
    • 与此答案相同,但您传递的是 SharedPreferences 而不是整个上下文。您可以在Activity 中获取SharedPreferences
    • 感谢您的回答。很遗憾,我只是被减掉了,因为我是新手,我不明白类似主题的答案。
    【解决方案2】:

    如果您的 AsyncTask 是某个 Activity 的内部类,那么您可以按照 @Alex 的建议进行操作并将其引用为

    ParentActivity.this
    

    如果 AsyncTask 独立存在,您需要为其提供 Context,或者更好的是,使用回调来完成此任务,您可以从 onPostExecute 调用它。

    Background task = new Background(this, ...);
    task.Run();
    
    // Your Activity will need to have some callback methods that you've decided to create
    public interface BackgroundListener{
        void onBackgroundCompleted(String s);
    }
    

    然后在你的 onPostExecute 中:

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        mCallback.onBackgroundCompleted(s);
    }
    

    【讨论】:

      【解决方案3】:
      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
      

      【讨论】:

      • YourActivity 是什么意思?我用“MainActivity”试过这个,但我得到它不是封闭类的错误。
      • 然后将您的活动传递给您的后台构造函数
      • 我没有注意到你已经有了上下文。所以使用 thr 上下文,我已经编辑了答案
      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多