我正在使用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中是空的但我为什么要做什么,我不知道!
答案 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()
}