我需要将AsynTask的OnPostExecute()方法生成的String值设置为Another Activity的Textview,因为我使用了以下两种方法,但两种方法都失败了。
方法1:使用GetterSetter类
我对android很新。我正在制作一个应用程序,我坚持这个特殊的问题。我从BackgroundTask类运行asyncTask,而BackgroundTask从StringGenerator类运行。在这个AsyncTask中,我将字符串的值设置为getterSetter类。
My String Generator类 - >
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类,这里日志打印正确的字符串。所以,字符串设置在这里,我已经验证了它。 - &GT;
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类我想要访问字符串并将其设置到另一个名为Answer Activity的Activity上的textview。
我的答案活动 - &gt;
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());
}
}
此方法的问题是 - &gt;
但是textview上设置的String值为空,因此会打印出来 没有。此外,我试图记录字符串。
方法2:使用SharedPreferences,但它始终为我提供默认值,即&#34;&#34;(空)。
我的StringGenerator类 - &gt;
public class StringGenerator {
...
new BackgroundTask(context).execute(sb.toString());
Intent intent = new Intent(context.getApplicationContext(),Answer.class);
context.startActivity(intent);
sb.setLength(0);
}
我的BackgroundTask类 - &gt;
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();
}
}
我的答案课 - &gt;
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",""));
}
}
此方法的问题是 - &gt;
此方法仅在第一次设置正确的输出字符串,然后此方法将打印默认值,即#34;&#34;(空).I尝试通过打印日志调试此方法,并在日志中字符串值不为空,我在日志中得到正确的值。 所以,我认为在这种方法中问题是共享偏好值的更新。我还在stackoverflow上研究了这个问题,并尝试了以下解决方案,但没有任何效果。
还有更多。
任何人都可以告诉我如何在第一个方法中访问OnCreate Activity中的字符串?或者对于第二种方法,我需要获取SharedPreferences的更新值。
我不想创建另一个intent,因为我已经从String Generator类运行了intent。
答案 0 :(得分:0)
首先inf
将创建一个新对象...现在让我们看看内存是如何工作的......
new GetterSetter()
现在有以下几点: -
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(); // assume is stored at address 2000 in the memory
getterSetter.setString(s);
}
}
public class Answer extends AppCompatActivity {
GetterSetter getterSetter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_answer);
getterSetter = new GetterSetter();// assume stored at 2008 in the memory , hence the string private String string does not have any value...
((TextView)findViewById(R.id.SetSteps)).setText(getterSetter.getString());
}
}
如果您将其声明为private String string;
,则不会发生空指针异常。
您应该只有一个private String string = "";
初始化GetterSetter getterSetter;
只有一次,然后该值将保持不变...如果您在单独的文件中同时拥有getterSetter = new GetterSetter();
和BackgroundTask
Answer
班级无法看到Answer
班级BackgroundTask
...
使用Activity类包含BackgroundTask并在onPostExecute中调用textview.setText ...
public class Answer扩展AppCompatActivity {
GetterSetter
} }
类BackgroundTask扩展了AsyncTask {
GetterSetter getterSetter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_answer);
getterSetter = new GetterSetter();
}
class BackgroundTask extends AsyncTask<String, Void, String> {
Context context;
...
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("Answer",s);
getterSetter.setString(s);
((TextView)findViewById(R.id.SetSteps)).setText(getterSetter.getString());
}
}
Context context;
public static GetterSetter getterSetter; // this will store the object in memory and the value will persist between classes...
...
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("Answer",s);
getterSetter = new GetterSetter();
getterSetter.setString(s);
// the activity Answer should start anywhere after this to get the correct value...
}
希望它有所帮助...
答案 1 :(得分:0)
在创建新对象时,将破坏现有对象中的数据。因此,执行上述任务的最简单方法是使用intent发送对象。您可以在PostExecute或单击第一个活动中的按钮时执行此操作。
Intent intent = new Intent(MainActivity.this, Answer.class);
intent.putExtra("Object", getterSetter);
startActivity(intent);
并且您的对象即GetterSetter必须将Serializable实现为:
class GetterSetter implements Serializable
并且在您的另一个活动中,即Answer.java,您必须接收意图:
Intent rcv = getIntent();
GetterSetter getterSetter = (GetterSetter) rcv.getSerializableExtra("Object");,
((TextView)findViewById(R.id.SetSteps)).setText(getterSetter.getString());