1

Webサービスクラスでは、オンラインからデータベースを取得し、リストに追加します。

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

メインアクティビティクラスで、リストのサイズを確認したい:

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();

または

誰もが提案しているように、クラスで1つの関数を作成し、その関数で配列のサイズを返します。以下のコードを参照してください。

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シグナルを送信するか、何かを実行する必要があります。allCommentListRetrieveFromSoap

また、リストを静的にしないでください。これはオブジェクト指向プログラミングの原則に反し、allCommentList変数を直接使用せずにゲッターを介して公開する必要があります。

編集:

実際には、離れて代わりに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");
    }
}

参照:AsyncTask | Android開発者

于 2012-05-01T10:58:42.930 に答える
0

List allCommentListはそこで初期化されないため、パブリックリストRetrieveFromSoap(SoapObject soap)内で初期化されます。

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

それでも私は1つの方法を作るために静的をよりよく使用するのは良くないことをお勧めします

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

これは非常に醜いので、「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();

もう1つの問題は、サイズを取得しようとしたときにリストの準備ができていない可能性があることです。なぜこれをスレッドで実行しているのですか?AsyncTaskを見たことがありますか?

于 2012-05-01T10:54:01.377 に答える
0

リストを(メインスレッドから)呼び出している場所とは異なるスレッド(networkThread)で作成するため、注意が必要です。外部からアクセスする前に、networkThreadが終了していることを確認する必要があります。

于 2012-05-01T10:56:22.450 に答える
0

静的にしArrayListます。次に、他のクラスからclassname.YourArrayListを使用してアクセスを取得できます。

于 2012-05-01T11:06:45.757 に答える