我的Arraylist在oncreate中为null

时间:2015-08-11 11:02:42

标签: java android json android-studio

我正在使用android studio进行编程,我想解析一个json并将我的对象中的细节放在MainActivity中的一个函数中,并且我在该函数中做得很好并且每件事都没问题!但是当我想在onCreate中使用它时它就是null。 我该怎么办? MainActivity:

public class MainActivity extends ActionBarActivity {
 ArrayList<Details> details= new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new myserver2().execute("");
    Adapter adptor=new Adapter(this,details);
    ListView l= (ListView) findViewById(R.id.listview);
    l.setAdapter(adptor);

}
private class myserver2 extends AsyncTask<String,String,String> {
    String s;

    @Override
    protected String doInBackground(String... params) {

        HttpClient client = new DefaultHttpClient();
        HttpGet hp = new HttpGet("http://jsonplaceholder.typicode.com/posts");
        try

        {
            HttpResponse r = client.execute(hp);
            HttpEntity ent = r.getEntity();
            String s = EntityUtils.toString(ent);
            JSONArray array = new JSONArray(s);
            JSONObject obj = new JSONObject();
            for(int i=0;i<array.length();i++){
                Details d = new Details();
                obj=array.getJSONObject(i);
                d.setId(Integer.parseInt(obj.getString("id")));
                d.setUserid(Integer.parseInt(obj.getString("userId")));
                d.setBody(obj.getString("body"));
                d.setTitle(obj.getString("title"));
                Log.i("**(*", obj.getString("title"));
                details.add(d);
            }

            Log.i("**(*", details.get(0).getTitle());

        } catch (
                IOException e
                )

        {
            e.printStackTrace();
        } catch (
                JSONException e
                )

        {
            e.printStackTrace();
        }

        return null;
    }
}

详细说明:

public class Details {
int id=0,userid=0;
String body,title;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public int getUserid() {
    return userid;
}

public void setUserid(int userid) {
    this.userid = userid;
}

public String getBody() {
    return body;
}

public void setBody(String body) {
    this.body = body;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

}

我的日志在myserver中的for之后给出了真正的标题,但如果我有这个登录onCreate它会引发异常: java.lang.IndexOutOfBoundsException 而且因为我的Arraylis在onCreate中是空的但我为什么要做什么,我不知道!

5 个答案:

答案 0 :(得分:1)

您的onCreates尝试在asyc任务未完成时访问arraylist。要确保仅在asyc任务完成后设置适配器,请在onPostExecute()

中设置适配器
@Override 
protected void onPostExecute(String result) 
{ 
  super.onPostExecute(result);
  if(details.size > 0){
    Adapter adptor=new Adapter(this,details);
    l.setAdapter(adptor);
}else{
  l.setAdapter(null);
}

}

希望有所帮助!

答案 1 :(得分:0)

您可以覆盖onPostExecute()内的AsyncTask方法,并且可以正常设置适配器。在myserver2

中添加此代码
@Override
protected void onPostExecute(String message) {
    super.onPostExecute(message);

    Adapter adptor=new Adapter(MainActivity.this,details);
    ListView l= (ListView) findViewById(R.id.listview);
    l.setAdapter(adptor);
}

并从onCreate()中删除这3行。

答案 2 :(得分:0)

您可以使用asynctask Onpost()方法执行此操作 因为某些时候网络操作需要时间来获取日期,但是

Adapter adptor=new Adapter(this,details);
l.setAdapter(adptor);

答案 3 :(得分:0)

因为在主UI-Thread中调用了来自AsyncTask的onPostExecute-Method,所以可以在onPostExecute-Method中初始化listview和adapter。

  

onPostExecute(Result),在后台后的UI线程上调用   计算结束。背景计算的结果是   作为参数传递给此步骤。   http://developer.android.com/reference/android/os/AsyncTask.html

rows='[ ["Jan", 31],["Feb", 28],["Mar", 31],["Apr", 30],["May", 31],["Jun", 30]]'

答案 4 :(得分:0)

在你的oncreate方法中执行此操作

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Adapter adptor=new Adapter(this,details);
    ListView l= (ListView) findViewById(R.id.listview);
    l.setAdapter(adptor);
    new myserver2().execute("");
}

并在AsyncTask中添加此方法

@Override
protected void onPostExecute(String message) {
    super.onPostExecute(message);
    adpter.notifydatasetchanged()
}