首先,我不得不说我对原生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);
答案 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。您可以通过构造函数传递需要使用的变量。这是最佳实践,因为它可以使代码更容易阅读并且不会阻止主线程