【发布时间】:2018-05-19 19:05:16
【问题描述】:
我需要将 AsynTask 的 OnPostExecute() 方法生成的 String 值设置为另一个 Activity 的 Textview,因为我使用了以下两种方法,但两种方法都失败了。
方法一:使用GetterSetter类
我对 android 还很陌生。我正在制作一个应用程序,我在其中遇到了这个特定问题。我正在从 BackgroundTask 类运行 asyncTask,而 BackgroundTask 正在从 StringGenerator 类运行。在此 AsyncTask 中,我将字符串的值设置为 getterSetter 类。
我的字符串生成器类 -->
public class StringGenerator {
...
new BackgroundTask(context).execute(sb.toString());
Intent intent = new Intent(context.getApplicationContext(),Answer.class);
context.startActivity(intent);
sb.setLength(0);
}
我的 BackgroundTask 类 -->
class BackgroundTask extends AsyncTask<String, Void, String> {
Context context;
GetterSetter getterSetter;
...
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("Answer",s);
getterSetter = new GetterSetter();
getterSetter.setString(s);
}
}
我的 GetterSetter 类,这里的日志打印出正确的字符串。所以,这里设置了字符串,我已经验证过了。 -->
class GetterSetter{
private String string;
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
Log.d("S1",string);
Log.d("S2",this.string);
}
}
从这个 getterSetter 类中,我想访问字符串并将其设置到 textview 到另一个名为 Answer Activity 的活动上。
我的回答活动 -->
public class Answer extends AppCompatActivity {
GetterSetter getterSetter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_answer);
getterSetter = new GetterSetter();
((TextView)findViewById(R.id.SetSteps)).setText(getterSetter.getString());
}
}
这个方法的问题是 -->
但是textview上设置的String值是空的,所以打印 没有什么。另外,我尝试记录字符串。
方法2:使用SharedPreferences,但它总是给我默认值“”(空)。
我的 StringGenerator 类 -->
public class StringGenerator {
...
new BackgroundTask(context).execute(sb.toString());
Intent intent = new Intent(context.getApplicationContext(),Answer.class);
context.startActivity(intent);
sb.setLength(0);
}
我的 BackgroundTask 类 -->
class BackgroundTask extends AsyncTask<String, Void, String> {
Context context;
SharedPreferences.Editor editor;
BackgroundTask(Context context) {
this.context = context;
editor = context.getSharedPreferences("SolutionString",context.MODE_PRIVATE).edit();
}
...
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("Answer", s);
editor.putString("Solution",s);
editor.apply();
}
}
我的答题课-->
public class Answer extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_answer);
SharedPreferences sharedPreferences = getSharedPreferences("SolutionString", MODE_PRIVATE);
((TextView)findViewById(R.id.SetSteps)).setText(sharedPreferences.getString("Solution",""));
}
}
这个方法的问题是 -->
这个方法只会在第一次设置正确的输出字符串,在第二次之后这个方法将打印默认值“”(空)。我尝试通过调试这个方法打印日志和日志中的字符串值不为空,我在日志中得到了正确的值。 所以,我认为这种方法的问题在于 sharedpreferences 值的更新。我也在 stackoverflow 上对此进行了研究,并尝试了以下解决方案,但没有任何效果。
还有更多。
谁能告诉我如何在第一种方法中访问 OnCreate Activity 中的字符串?或者对于第二种方法,我需要获取 SharedPreferences 的更新值。
我不想创建另一个意图,因为我已经从字符串生成器类运行意图。
【问题讨论】:
-
你的后台任务在 Answer 类里面吗?
-
不,这是不同的类别。
-
你在哪里初始化异步类?另外你为什么在与主类不同的类中创建一个异步任务?
-
我只是调用了构造函数并执行了doinbackground方法,我不需要使用对象进行初始化,并且由于性能问题我需要同时运行两个进程,如果我不使用AsyncTask需要很长时间。我现在将尝试使用 sharedpreferences 来存储和获取值,我认为这个 getter 和 setter 不会起作用。
-
你在哪里见过这样使用它?
标签: java android sharedpreferences