从AsyncTask访问Application Class或来自任何类

时间:2015-08-05 23:10:37

标签: java android android-asynctask sharedpreferences global

我无法从AsyncTask访问Application Class,或者使用上次更新数据的SharedPreferences等问题。

基本上为什么我需要我的全局变量是跟踪当前活动的活动,它应该可以从任何类型的类访问,例如活动 AsyncTask 服务接收方应用等等......

我知道这里有很多问题=答案,但没有一个帮助过我。

我尝试了几种方法来做到这一点,但找不到任何真正的解决方法。

使用 SharedPreferences ,我可以使用它,但在首选项更新和重新启动后,返回之前的值,仅在重新启动应用后才有效。

使用应用程序类,没有运气,无法从AsyncTask和服务访问应用程序

服务每5秒运行一次 AsyncTask ,AsyncTask应该知道MainActivity是否已打开并运行,因此它可以更新内容。

我得到了很多东西,但是,有了这个,我花了太多时间进行搜索。

所以,如果有人可以帮我这个,那就太好了。 :)

以下是我的例子......

MainActivity.java

public class MainActivity extends Activity {
    private boolean active = false;
    SharedPreferences prefs;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        this.prefs = context.getSharedPreferences("com.my.app", Context.MODE_PRIVATE);
        storeActivity("MainActivity");

        this.active = true;

        ((App) this.getApplication()).setTopActivity("MainActivity");
    }

    public void storeActivity(String TOP_ACTIVITY) {
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("TOP_ACTIVITY", TOP_ACTIVITY);
        editor.apply();
        editor.commit();           
    }

    @Override
    public void onResume() {
        super.onResume();
        ((App) this.getApplication()).setTopActivity("MainActivity");
        this.active = true;
        storeActivity("MainActivity");
    }

    @Override
    public void onPause() {
        super.onPause();
        ((App) this.getApplication()).setTopActivity("");
        this.active = false;
        storeActivity("");
    }
    @Override
    public void onStart() {
        super.onStart();
        ((App) this.getApplication()).setTopActivity(ACTIVITY_NAME);
        this.active = true;
        storeActivity("MainActivity");
    }
    @Override
    public void onStop() {
        super.onStop();
        ((App) this.getApplication()).setTopActivity("");
        this.active = false;
        storeActivity("");
    }

}

这是我的应用程序对象,

App.java

public class App extends Application {
    private String TOP_ACTIVITY;

    public String getTopActivity() {
        return TOP_ACTIVITY;
    }
    public void setTopActivity(String CURRENT_ACTIVITY) {
        this.TOP_ACTIVITY = CURRENT_ACTIVITY;
    }
    public static Application getApplication() {
        return new App();
    }
}

这里有一些从服务器获取信息的AsyncTask

Socket.java

public class SocketUpdater extends AsyncTask<String,Void,String> {
    private Context context;
    private SharedPreferences prefs;

    public SocketUpdater(Context context) {
        this.context = context;
        this.prefs = context.getSharedPreferences("com.my.app", Context.MODE_PRIVATE);
    }

    @Override
    protected String doInBackground(String... arg0) {
        StringBuffer result = new StringBuffer("");
        return new String(result);
    }

    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(context, "RESULT: " + result, Toast.LENGTH_SHORT).show();

        String TOP_ACTIVITY = ((App) this.getApplication()).getTopActivity();
        // THIS CANT WORK, NO this.getApplication()!!!

        boolean MainActivityActive = MainActivity.active;
        // THIS RETURNS ME FALSE ALL THE TIME

        SharedPreferences.Editor editor = prefs.edit();
        String PREF_TOP_ACTIVITY = prefs.getString("TOP_ACTIVITY", "");            

        if(MainActivityActive) { 
            Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
        }

        if(TOP_ACTIVITY.equals("MainActivity")) {
            Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
        }

        if(PREF_TOP_ACTIVITY.equals("MainActivity")) {
            Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
        }

    }

}

2 个答案:

答案 0 :(得分:0)

为什么不使用&#34; Otto&#34;广场的图书馆?您可以在活动和服务之间轻松发送对象。我出于类似目的在我的申请中使用它。

答案 1 :(得分:0)

我花了好几天时间来寻找导致问题的原因。

我为此找到了简单的解决方案,并且让所有方法都像我想要的那样工作。

事情就是我让我的服务运行自己的分离过程:

<service android:name="fi.hgs.apps.MyService"
    android:process=":myService"
</service>

刚刚从AndroidManifest.xml中删除 android:process =&#34;:myService&#34;