簡體   English   中英

我的Arraylist在oncreate中為null

[英]My Arraylist is null in oncreate

我正在用android studio編程,我想解析一個json並將詳細信息放在MainActivity中的函數中的對象中,我在該函數中做得很好,一切正常! 但是,當我想在onCreate中使用它時,它為null。 我該怎么辦? 主要活動:

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中為null,但是我為什么以及該怎么辦,我不知道!

您的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);
}

}

希望有幫助!

您可以在AsyncTask覆蓋onPostExecute()方法,並且可以在此處正常設置適配器。 將此代碼添加到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()刪除這三行。

您可以在asynctask Onpost()方法中執行此操作,因為網絡操作需要花費一些時間才能獲取日期,但是

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

由於在主UI線程中調用了AsyncTask的onPostExecute-Method,因此您可以在onPostExecute-Method中初始化列表視圖和適配器。

onPostExecute(Result),在后台計算完成后在UI線程上調用。 后台計算的結果作為參數傳遞到此步驟。 http://developer.android.com/reference/android/os/AsyncTask.html

@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方法中執行此操作

@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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM