getAssets();从另一个类(新帖子)看到loadJSONFromAsset()

时间:2017-01-07 23:54:06

标签: android json

加入社区非常好!对于我的第一篇文章,我在使用除了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;

}

}

2 个答案:

答案 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;

}