从其他类访问方法

时间:2018-05-19 19:05:17

标签: java android sharedpreferences

我需要将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上研究了这个问题,并尝试了以下解决方案,但没有任何效果。

  1. SharedPreferences return only default value
  2. getPreferences always returns default value
  3. 还有更多。

    任何人都可以告诉我如何在第一个方法中访问OnCreate Activity中的字符串?或者对于第二种方法,我需要获取SharedPreferences的更新值。

    我不想创建另一个intent,因为我已经从String Generator类运行了intent。

2 个答案:

答案 0 :(得分:0)

首先inf将创建一个新对象...现在让我们看看内存是如何工作的......

new GetterSetter()

现在有以下几点: -

  1. 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;,则不会发生空指针异常。

  2. 您应该只有一个private String string = "";初始化GetterSetter getterSetter;只有一次,然后该值将保持不变...如果您在单独的文件中同时拥有getterSetter = new GetterSetter();BackgroundTask Answer班级无法看到Answer班级BackgroundTask ...

  3. 使用Activity类包含BackgroundTask并在onPostExecute中调用textview.setText ...

  4. public class Answer扩展AppCompatActivity {

    GetterSetter

    } }

    1. 如果您坚持使用不同的文件,则应首先调用BackgroundTask并
    2. 类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());