使用AsyncTask进行SharedPreference和一般初始化的最佳做法?

时间:2016-06-22 22:52:53

标签: java android android-asynctask

首先,我不得不说我对原生Android开发有点新意。我在我的MainActivity课程中将以下代码置于 onCreate中。

我从未使用过AsyncTask,所以我不知道这是否是最好的做法。我应该创建一个新的AsyncTask类并以某种方式在onCreate方法中加载它吗?我将它放在MainActivity onCreate方法中,因为变量的范围包括bp(计费购买类),pollfish,计算应用程序启动等等。

另外我不知道该返回什么?因为我有多个结果。有许多教程如何创建这样的AsyncTask以及在那里存储SharedPreferences的建议,但我想知道它的最佳实践。例如,稍后在我的onResume方法或类似操作中获取值。

    new AsyncTask<Context, Void, String>()
    {
        @Override
        protected String doInBackground(Context... params)
        {
            Context context = params[0];
            SharedPreferences pref = context.getSharedPreferences("Pref",Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();

            // Count App Launches
            totalCount = pref.getInt("counter", 0);
            totalCount++;
            editor.putInt("counter", totalCount);
            editor.apply();

            // Pollfish ADS
            int pollfishPref = pref.getInt("pollfish", 0);
            Log.d(TAG,"Application launch count: " + totalCount);
            Log.d(TAG,"pollfish count: " + pollfishPref);

            if (!bp.isPurchased(PRODUCT_ID) && (pollfishPref == 0 || (pollfishPref != 0 && pollfishPref <= totalCount)))
            {
                PollFish.ParamsBuilder paramsBuilder = new PollFish.ParamsBuilder("xxx")
                        .releaseMode(false)
                        .customMode(false)
                        .indicatorPosition(Position.MIDDLE_RIGHT)
                        .indicatorPadding(0)
                        .build();
                PollFish.initWith(MainActivity.this, paramsBuilder);
                mTracker.setScreenName("Pollfish Count: " + pollfishPref + " Applaunch Count: " + totalCount);
                mTracker.send(new HitBuilders.ScreenViewBuilder().build());
            }

            Boolean consumed = pref.getBoolean("consumed", Boolean.parseBoolean(null));
            Log.d(TAG,"consumedPref: " + consumed);

            if (!consumed)
            {
                editor.putBoolean("consumed", true);
                editor.apply();
                bp.consumePurchase(PRODUCT_ID);
                Log.d(TAG,"consumed now!");
            }

            return xxx;
        }

        protected void onPostExecute(String result)
        {
            Log.d(TAG, "Preference received in background: " + result);
        };
    }.execute(this);

2 个答案:

答案 0 :(得分:3)

通常,最佳做法是通过单独的类重用AsyncTask和更清晰的代码。如果您担心变量范围,可以将它们传递给AsyncTask的构造函数。

class MyAsyncTask extends AsyncTask<Params, Progress, Result> {
    private Object arg1;

    public MyAsyncTask(Object arg1) {
        this.arg1 = arg1;
    }

    @Override 
    public Result doInBackground(Params... params) { }

    @Override
    public void onPostExecute(Result result) { }
}

当然,更新必要的对象类型,并像这样使用

new MyAsyncTask(arg1).execute();

您可能希望从SharedPreferences之外的AsyncTask更新和检索值,然后将这些值传递给构造函数,如图所示。

  

我不知道该返回什么?因为我有多个结果。

可悲的是,你只能归还一种类型。如果您关心如何将结果从AsyncTask返回到您调用它的位置,那么我建议callbacks

答案 1 :(得分:1)

您应该将异步任务分离到单独的类中,并使其扩展AsyncTask。您可以通过构造函数传递需要使用的变量。这是最佳实践,因为它可以使代码更容易阅读并且不会阻止主线程