加入社区非常好!对于我的第一篇文章,我在使用除了main之外的类getAssets()
时遇到问题。在我的MainActivity类中,
它运作良好,但如果我想在我的其他类中使用getAssets()
LoadJSONFromAsset()
,则不会。我读到我需要使用上下文,
我试着。
我的代码有什么问题?我如何在MainActivity中使用Context?
报告是:
java.lang.NullPointerException:尝试调用虚方法 'android.content.res.AssetManager android.content.Context.getAssets()' 在空对象引用上
感谢您的建议。
MainActivity类:
public class MainActivity extends Activity {
TextToSpeech TTS;
static Context myContext;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Json mydata=new Json();
mydata.LireStation(14);
Button BadB=(Button)findViewById(R.id.Bad);
Button BagB=(Button)findViewById(R.id.Bag);
我的Json课程:
public class Json extends Activity {
JSONArray myJsonArray;
public Json(){
System.out.println("Json !!!!");
try {
System.out.println("on est dans le try !!!");
String myJsonString=loadJSONFromAsset();
myJsonArray = new JSONArray(myJsonString);
//On fabrique un joli tableau pour ranger chacune des points GPS
int arrSize = myJsonArray.length();
System.out.println("longueur : "+arrSize);
List<Double> lat = new ArrayList<Double>(arrSize);
List<Double> lon = new ArrayList<Double>(arrSize);
for (int i = 0; i < arrSize; ++i)
{
//System.out.println("on est dans le for !!!");
JSONObject STATION=myJsonArray.getJSONObject(i);
JSONObject objetField=STATION.getJSONObject("fields"); //on refabrique un objet json fils du pere Alelouia
lat.add((Double) (objetField.getDouble("stop_lat")));
lon.add((Double) (objetField.getDouble("stop_lon")));
//Double res = obj.getDouble("departement");
//System.out.println(lat);
}
//JSONObject STATION=myJsonArray.getJSONObject(2);
//LireStation(10); // go à l'affichage
} catch (Exception e) {
e.printStackTrace();
System.out.println("ECHEC DE LECTURE JSON");
}
}
public String LireStation(int index)
{
String infos="";
try {
String myJsonString;
myJsonString=loadJSONFromAsset();
JSONArray myJsonArray = new JSONArray(myJsonString);
JSONObject STATION=myJsonArray.getJSONObject(index);
JSONObject objetFielddd = STATION.getJSONObject("fields");
String NomStation;String NomArret; String CodePostal;
NomStation = (objetFielddd.getString("stop_name"));
NomArret=(Double.toString(objetFielddd.getDouble("stop_lat")));
CodePostal=(objetFielddd.getString("code_postal"));
infos="Station"+" "+NomStation+" "+"adresse"+NomArret+"kodpostal"+CodePostal;
}
catch (Exception e) {
e.printStackTrace();
infos="Pas de données";
}
return infos;
}
public String loadJSONFromAsset() {
String json = null;
try {
AssetManager mngr = MainActivity.myContext.getAssets();
InputStream is = mngr.open("positionStations.json");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
json = new String(buffer, "UTF-8");
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
return json;
}
}
答案 0 :(得分:0)
您在代码中直接使用MainActivity
的引用
AssetManager mngr = MainActivity.myContext.getAssets();
但您应该使用您尝试获取Assetmanager
的类的上下文。所以它应该像
AssetManager assetMgr = this.getAssets(); //this means reference to current activity
答案 1 :(得分:0)
我找到了这个解决方案并且效果很好。首先在MainActivity中放置一个静态上下文,并在Json类中调用上下文:
MainActivity:
public class MainActivity extends Activity {
TextToSpeech TTS;
static Context myContext;
boolean found=false; //valeur sattion trouvee ou non
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myContext = this;
Json Class:
public String loadJSONFromAsset() {
String json = null;
try {
InputStream is = MainActivity.myContext.getAssets().open("positionStations.json");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
json = new String(buffer, "UTF-8");
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
return json;
}