-1

我已经编辑了代码,现在空指针错误指向 for 循环内部,它们的错误比以前少,但我仍然不知道为什么调用空指针。

 public class searchlist extends ListActivity 
 {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    new loadSomeStuff().execute();
}

public class loadSomeStuff extends AsyncTask<String, Integer, String[]>
{
  ProgressDialog dialog;

  protected void onPreExecute()
  {
     dialog = new ProgressDialog(searchlist.this); 
     dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
     dialog.setMax(100);
     dialog.show();
  }
    @Override
    protected String[] doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        for(int i =0; i<20; i++)
        {
          publishProgress(5);
          try
          {
          Thread.sleep(80);
          } catch(InterruptedException e)
          {
              e.printStackTrace();
          }
        }
        dialog.dismiss();
        int loops = search_page.returnlooped();
        int[] teacup = search_page.returnNumArray();
        sqlStuff searching = new sqlStuff(searchlist.this);
        String[] IDSysNames = searching.getIDSysName();
        searching.close();

        String[] resultList = new String[loops];
        for(int i=0; i < loops; i++ )
        {
            if(IDSysNames[teacup[i]] != null)
            {

            resultList[i].equals(IDSysNames[teacup[i]]);

            }
        }
         setListAdapter(new ArrayAdapter<String>(searchlist.this, android.R.layout.simple_list_item_1, resultList));
        return null;
    }

    protected void onProgressUpdate(Integer...progress)
    {
        dialog.incrementProgressBy(progress[0]);
    }
}





@Override
public void onListItemClick(ListView l, View v, int position, long id){
     //TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    //String Pos = resultList[position];

    Intent ourIntent = new Intent("com.MC.ChemPal.RESULT2");
    startActivity(ourIntent);
}
}   

上面代码中使用的方法如下。

public String[] getIDSysName()
{
    String[] result = new String[0];

    try
    {
        String[] columns = new String[] {KEY_SYSNAME};
        Cursor c  =  ChemPal.query(DATABASE_TABLE, columns, null, null, null, null, null);
        Log.d("SqlDStuff", "Cursor count: "+c.getCount());
        int iSysName = c.getColumnIndex(KEY_SYSNAME);

        int i = 0;
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
            i++;
        }

        result = new String[i];
        i = 0;
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
            result[i] = c.getString(iSysName);
            i++;

        }
    }
    catch(Exception e)
    {   

    }

    return result;
}
4

1 回答 1

0

你不能这样做

int loops = search_page.returnlooped();
int[] teacup = search_page.returnNumArray();

之前onCreate(),因为您正在尝试访问仍未初始化的应用程序资源(因此是 NPE)。正如您在此处看到的,您不能假设活动在onCreate()被调用之前已启动。

Activity 的整个生命周期发生在第一次调用 onCreate(Bundle) 到最后一次调用 onDestroy() 之间。

作为一般规则:在被调用之前你不应该做任何事情。onCreate()

此外,您不应该进行 DB 读入,onCreate()因为这是由 UI 线程运行的,如果 DB 访问时间过长,您可能会收到 ANR。请参阅AsyncTasks在后台执行任务(如果您的 GUI 立即需要该数据,您可能会在加载数据时考虑使用ProgressDialog )。

于 2013-05-04T18:31:23.210 回答