共享偏好VS上下文?

时间:2014-02-22 15:57:30

标签: java android sharedpreferences android-context

我在Android方面的经验不多,所以到目前为止我写的每一段代码都非常简单。现在我需要实现一个本地化和导航应用程序,所以我需要将我的代码分解为模块,以便我可以单独更改每个组件。我有一些变量,我需要在不同的类之间共享它们。我使用了静态变量,但我在这里的一些帖子中读到静态变量不是首选。然后我发现了其他一些关于Context的帖子。所以我创建了一个名为Globals的类,并在我的Manifest文件中添加了以下行:

 <application android:name="com.example.smartnav.Globals" 
  package="com.example.smartnav"
 android:icon="@drawable/ic_launcher"
 android:allowBackup="true"

   android:label="@string/app_name"/>

这是Globals Class:

    package com.example.smartnav;


import java.util.List;

import android.net.wifi.ScanResult;

import android.app.Application;

public class Globals extends Application {
      private Boolean Scanning=false;
      private String Logname;
      private int interval;
      private int numOfScans;
      private List<ScanResult> result;



      //getters
      public Boolean getScannig(){
        return Scanning;
      }
      public int getInterval()
      {
          return interval;
      }
      public int getScans()
      {
          return numOfScans;
      }
      public List<ScanResult> getRes()
      {
          return result;
      }
      public String getLog()
      {
          return Logname;
      }


    //setter

      public void setScanning(Boolean s){
        Scanning= s;
      }
      public void setRes(List<ScanResult> res)
      {
          result =res;
      }
      public void setInterval(int I)
      {
          interval = I;
      }
      public void setScans(int S)
      {
          numOfScans=S;
      }
      public void setLog(String s)
      {
          Logname= s;
      }

}

现在我有两个问题,第一个问题是每当我尝试使用Globals类时我的应用程序都会崩溃,这里是代码:我是否错误地使用了上下文?

    public class MainActivity extends Activity {

    private Context context;
    public WifiManager Wifi;
    private  WifiReceiver receiverWifi;
    private IntentFilter filter;
    private List<ScanResult> result;
    private File AppDir;
    private static String filename;
    private File file;
    private FileWriter writer;
    private Globals AppState ;
    private int Interval;
    private int numOfScans;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("Main ","activity created");
        //
       AppState = ((Globals)getApplicationContext());
       context= this;
       Wifi=(WifiManager) getSystemService(Context.WIFI_SERVICE);
       receiverWifi = new WifiReceiver();
        filter= new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(receiverWifi, filter);

      Log.d("Main   ","wifi registered");
        // create the application directory

        AppDir = new File(Environment.getExternalStorageDirectory()+"/SmartNavi/Log");
        if(AppDir.isDirectory())
        {
            filename=Environment.getExternalStorageDirectory()+"/SmartNavi/Log/log.txt";
            file = new File(filename);
            if(!file.exists())
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            else 
            {
                Date d= new Date();
                filename=Environment.getExternalStorageDirectory()+"/SmartNavi/Log/log"+d.getTime()+".txt";
                file = new File(filename);
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            }
        else
        {
            AppDir.mkdirs();
            filename=Environment.getExternalStorageDirectory()+"/SmartNavi/Log/log.txt";
            file = new File(filename);
            if(!file.exists())
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            else 
            {
                Date d= new Date();
                filename=Environment.getExternalStorageDirectory()+"/SmartNavi/Log/log"+d.getTime()+".txt";
                file = new File(filename);
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

        //setting pars

        Interval=250;
        numOfScans=4;
        AppState.setInterval(Interval);
        AppState.setScans(numOfScans);
        AppState.setLog(filename);


        Wifi.startScan();

        try {
                writer = new FileWriter(file, true);
                writer.append("Smart Navigation. \n");
                writer.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
       // AsyncScanning.AsyncScan();
    }//on create



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }



    class WifiReceiver extends BroadcastReceiver {

        public void onReceive(Context c, Intent intent) {

            result=Wifi.getScanResults();
    //      AppState.setRes(result);
             try {
                writer = new FileWriter(file, true);
                writer.append(result.size()+" s \n");
                writer.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }//end of on receive

    }// end of class
} // end of smartNav

我的最后一个问题是:我在这里已经阅读了一些答案,如果我的应用程序成为后台进程,那么上下文中的所有数据都将设置为null,我将丢失我的上下文。有没有办法克服这一点?或者我应该切换到SharedPreferences?

编辑:这是Logcat的输出

  

java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.smartnav / com.example.smartnav.MainActivity}:java.lang.ClassCastException:android.app.Application无法强制转换为com.example.smartnav .Globals

1 个答案:

答案 0 :(得分:1)

  

现在我有两个问题,第一个问题是每当我尝试使用Globals类时我的应用程序都会崩溃,这里是代码:我是否错误地使用了上下文?

你应该使用getApplication()方法,或者让你的应用程序类单例化,这样你就可以调用Globals.getInstance().getMyVariable()等。

  

我的最后一个问题是:我在这里已经阅读了一些答案,如果我的应用程序成为后台进程,那么上下文中的所有数据都将设置为null,我将丢失我的上下文。有没有办法克服这一点?或者我应该切换到SharedPreferences?

如果你的应用程序变为后台,那么Android更有可能杀死你的应用程序,这样也会破坏你所有的静态对象。在你的Globals类中,你不应该将数据存储在静态变量中,而是存储在一些持久存储中 - 如果它很小则使用SharedPreferences,如果它很大,那么你可以将它存储在json中并保存到应用程序内存中,或使用sqlite db。