1

在 webservice 类中,它将从在线检索数据库并放入列表中:

public List<List_NewsComment> allCommentList;
public void GetCommentNews( final int gCommentNewsID)
{
    Thread networkThread=new Thread(){
        @Override
        public void run(){

            try
            {
                SoapObject request= new SoapObject(NAMESPACE,get_Comment_METHOD_NAME);
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                HttpTransportSE androidHttpTransportSE= new HttpTransportSE(URL,60000);

                request.addProperty("itemid", gCommentNewsID);
                envelope.setOutputSoapObject(request);
                androidHttpTransportSE.call(get_Comment_SOAP_ACTION, envelope);

                SoapObject result=(SoapObject)envelope.bodyIn;
                RetrieveFromSoap( result);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }

    };
    networkThread.start();

}

public List<List_NewsComment> RetrieveFromSoap(SoapObject soap)
{
    allCommentList= new ArrayList<List_NewsComment>();
    Vector<Object> property2 = extracted(soap);

    for (int i = 0; i< property2.size();i++){

        SoapObject getPropertyD=(SoapObject)property2.get(i);


        List_NewsComment addcomment= new List_NewsComment();
        addcomment.setcommentDate(getPropertyD.getProperty("date").toString());
        addcomment.setUserName( getPropertyD.getProperty("name").toString());
        addcomment.setCommentContent(getPropertyD.getProperty("comment").toString());

        allCommentList.add(addcomment);
    }
    webservice.allCommentList.size();        <-- can call here no problem
    return allCommentList;
}

private static Vector<Object> extracted(SoapObject soap) {
    return (Vector<Object>)soap.getProperty(0);
}

在 Main Activity 类中,我想检查列表的大小:

Database_WebService webservice = new Database_WebService(this);
    webservice.GetCommentNews(newsid);
webservice.allCommentList.size();            <-- cannot call here, what is the problem

它返回我nullpointerexception

问题是什么????

4

7 回答 7

2

使List static您可以使用该类名在任何地方访问它。

喜欢

public static List<List_NewsComment> allCommentList;
Database_WebService.allCommentList.size();

或者

正如每个人都建议在您的类中创建一个函数并返回该函数中数组的大小。请看下面的代码。

public int getCommentListSize()
{
    return allCommentList.size(); 
}

then call this method as

Database_WebService databaseWebservice = new Database_WebService(this);   
int size =databaseWebservice.getCommentListSize.size(); 
于 2012-05-01T10:47:46.887 回答
1

它没有被初始化的原因是因为它正在线程中被初始化,所以事件的顺序是这样的:

  1. GetCommentNews开始
  2. 线程开始
  3. 现在正在同时运行列表大小(已损坏)的线程和使用情况

在线程完成执行之前您不能使用allCommentList,因此您需要在分配方法后在方法allCommentList内发出信号或执行某些操作。RetrieveFromSoap

此外,您不应该将列表设为静态,这违反了面向对象编程的原则,并且您应该allCommentList通过 getter 而不是直接使用变量公开。

编辑:

实际上,您最好远离Thread并使用一个AsyncTask相反的类,该类旨在使 UI 工作Thread变得更容易。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));
        }
        return totalSize;
    }

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

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
}

参考:异步任务 | 安卓开发者

于 2012-05-01T10:58:42.930 回答
0

因为 List allCommentList 没有在那里初始化,所以它将在公共 List RetrieveFromSoap(SoapObject soap) 内初始化。

于 2012-05-01T10:48:54.843 回答
0
public static List<List_NewsComment> allCommentList;
int size =Database_WebService.allCommentList.size(); 
--------------------------------------------------

我仍然建议不要更好地使用静态来制作一种方法

public int getArrSize()
{
    return allCommentList.size(); 
}

然后将此方法称为

Database_WebService dvws = new Database_WebService(this);   
int size =dvws allCommentList.size(); 
于 2012-05-01T10:48:59.373 回答
0

当您在不同的线程(networkThread)中创建列表时,您必须小心,您从哪里调用它(从主线程)。在从外部访问它之前,您应该确保 networkThread 已经完成。

于 2012-05-01T10:56:22.450 回答
0

这很丑,为什么不添加一个像'int webservice.getCommentsSize()'这样的方法并返回大小,这样你就可以测试列表是否不为空并且你不需要直接访问。

喜欢:

class Webservice{
 private List allCommentList = null;
 public int getCommentListSize(){
  if(allCommentList==null) return 0;
  return allCommentList.size();
 }

}

主要:

 Webservice webservice = new Webservice();
 int size = webservice.getCommentListSize();

另一个问题是,在您尝试获取其大小时,您的列表可能还没有准备好。你为什么要在一个线程中运行它?你见过 AsyncTask 吗?

于 2012-05-01T10:54:01.377 回答
0

Make the ArrayList static. Then you can get access using classname.YourArrayList from the other class.

于 2012-05-01T11:06:45.757 回答