Java 共享偏好与上下文?
我在Android方面没有太多的经验,所以到目前为止我写的每一段代码都非常简单。现在我需要实现一个本地化和导航应用程序,所以我需要将代码分解成模块,这样我就可以单独更改每个组件。我有一些变量需要在不同的类之间共享。我使用了静态变量,但我在这里的一些帖子中读到,静态变量不是首选的。然后我发现一些其他的帖子在谈论上下文。因此,我创建了一个名为Globals的类,并在清单文件中添加了以下行:Java 共享偏好与上下文?,java,android,sharedpreferences,android-context,Java,Android,Sharedpreferences,Android Context,我在Android方面没有太多的经验,所以到目前为止我写的每一段代码都非常简单。现在我需要实现一个本地化和导航应用程序,所以我需要将代码分解成模块,这样我就可以单独更改每个组件。我有一些变量需要在不同的类之间共享。我使用了静态变量,但我在这里的一些帖子中读到,静态变量不是首选的。然后我发现一些其他的帖子在谈论上下文。因此,我创建了一个名为Globals的类,并在清单文件中添加了以下行: <application android:name="com.example.smartnav.Glo
<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课程:
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;
}
}
package com.example.smartnav;
导入java.util.List;
导入android.net.wifi.ScanResult;
导入android.app.Application;
公共类Globals扩展了应用程序{
私有布尔扫描=假;
私有字符串日志名;
私有整数间隔;
私人int NUMOF扫描;
私有列表结果;
//吸气剂
公共布尔getScannig(){
返回扫描;
}
公共整数getInterval()
{
返回间隔;
}
公共int getScans()
{
返回数字扫描;
}
公共列表getRes()
{
返回结果;
}
公共字符串getLog()
{
返回日志名;
}
//塞特
公共无效设置扫描(布尔值s){
扫描=s;
}
公共无效集合(列表集合)
{
结果=res;
}
公共无效设置间隔(int I)
{
间隔=I;
}
公共垃圾桶(内部垃圾桶)
{
numofs=S;
}
公共void setLog(字符串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
公共类MainActivity扩展活动{
私人语境;
公共WifiManager-Wifi;
私人无线接收器无线;
专用过滤器;
私有列表结果;
私有文件AppDir;
私有静态字符串文件名;
私有文件;
私有文件编写器;
私人的国家;
私有整数间隔;
私人int NUMOF扫描;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
日志d(“主要”、“创建的活动”);
//
AppState=((全局)getApplicationContext());
上下文=这个;
Wifi=(WifiManager)getSystemService(Context.Wifi\u服务);
receiverWifi=新WifiReceiver();
过滤器=新的意向过滤器(WifiManager.SCAN\u RESULTS\u AVAILABLE\u ACTION);
注册接收者(接收者、过滤器);
Log.d(“主”、“wifi注册”);
//创建应用程序目录
AppDir=新文件(Environment.getExternalStorageDirectory()+“/SmartNavi/Log”);
if(AppDir.isDirectory())
{
filename=Environment.getExternalStorageDirectory()+“/SmartNavi/Log/Log.txt”;
文件=新文件(文件名);
如果(!file.exists())
试一试{
createNewFile();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
其他的
{
日期d=新日期();
filename=Environment.getExternalStorageDirectory()+“/SmartNavi/Log/Log”+d.getTime()+“.txt”;
文件=新文件(文件名);
试一试{
createNewFile();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
其他的
{
AppDir.mkdirs();
filename=Environment.getExternalStorageDirectory()+“/SmartNavi/Log/Log.txt”;
文件=新文件(文件名);
如果(!file.exists())
试一试{
createNewFile();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
其他的
{
日期d=新日期();
filename=Environment.getExternalStorageDirectory()+“/SmartNavi/Log/Log”+d.getTime()+“.txt”;
文件=新文件(文件名);
试一试{
createNewFile();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
//设置PAR
间隔=250;
numOfScans=4;
AppState.setInterval(Interval);
AppState.setScans(NUMOFScan);
AppState.setLog(文件名);
Wifi.startScan();
试一试{
writer=newfilewriter(file,true);
writer.append(“智能导航”。\n”);
writer.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//AsyncScan.AsyncScan();
}//论创造
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
类WifiReceiver扩展了BroadcastReceiver{
接收时公共无效(上下文c,意图){
结果=Wifi.getScanResults();
//AppState.setRes(结果);
试一试{
writer=newfilewriter(file,true);
writer.append(result.size()+“s\n”);
writer.close();
}捕获(IOE异常){
//