2

PHPを介してデータを取得するasynctaskがあります。asynctask は正常に動作し、値をグローバル配列リストに渡します。ただし、.execute() の後に onCreate で変数を呼び出そうとすると、null のサイズ/値が返されます。このグローバル変数が値を持っているはずなのに、なぜ null を返すのか知りたいです。前もって感謝します!

これは非同期タスクのコードです:

 private class  get_pendingreq extends AsyncTask<String, Integer, String> 
 {
    @Override
    protected String doInBackground(String... arg0) 
    {
        InputStream is = null;
        String result = "";

        try 
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url+"pending_requests.php");

            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            parameter.add(new BasicNameValuePair("email", globalVariables.accountemail));


            httppost.setEntity(new UrlEncodedFormEntity(parameter));

            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

        } catch (Exception e) 
        {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }

        try 
        {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;

            while ((line = reader.readLine()) != null) 
            {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } catch (Exception e) 
        {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        return result;
    }

    @Override
    protected void onPostExecute(String result) 
    {
        super.onPostExecute(result);

        try 
        {
            /*  JSON parsing starts here    */
            JSONObject jArray = new JSONObject(result);
            /*globalVariables.pendingdate = new ArrayList<String>();*/
            JSONArray request = jArray.getJSONArray("request");

            for (int i = 0; i < request.length(); i++) 
            {

                JSONObject e = request.getJSONObject(i);

                /* puts values to arraylist<String>  */                 
                globalVariables.pendingdate.add(e.getString("date"));

            }

            Log.d("striiing", globalVariables.pendingdate.toString());
        } catch (JSONException e) 
        {
            e.printStackTrace();
                }
    }
}

主な活動:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.calendar);

    new get_pendingreq().execute();

    System.out.print("alalala" + globalVariables.pendingdate.size());
      }//this returns null

グローバル変数:

public static ArrayList<String> pendingdate = new ArrayList<String>;
4

4 に答える 4

4

AsyncTask終わっていないから です。入れSystem.out.print("finish");onPostExcute()、誰が最初に印刷されるかを確認します。

于 2013-03-17T04:27:38.737 に答える
1

の背後にある考え方AsyncTaskは、メイン スレッドから非同期で実行されるため、バックグラウンド スレッドで実行されるということです。そうすれば、メイン スレッドでのコードの実行がブロックされることはありません。

それを知っていると、次の行は次々に実行されます。

new get_pendingreq().execute();
System.out.print("alalala" + globalVariables.pendingdate.size());

クラスは少し遅れるまで実際の作業を行いませget_pendingreqん。つまり、上記のスニペットの最初の行を呼び出した後、実際には何も起こりません。近い将来のどこかで非同期タスクを開始するようにプラットフォームに指示しただけです。

ここでglobalVariables.pendingdate、2 行目でアクセスしているフィールドには、非同期タスクが作業を完了するまで値がありません。onPostExecute()が実行されるまで、それは起こりません。つまり、間違った時点で値を出力しようとしています。

その出力を非同期タスクのonPostExectute()メソッドの最後に移動するだけです(ただし、明らかに前にreturn-なぜそれがまったくあるのですか?)。

AsyncTaskクラスのドキュメントプロセスとスレッドの記事を一読することを強くお勧めします。

于 2013-03-17T04:34:40.697 に答える
0

AsyncTask という名前が実際に非同期で実行されることは明らかです...コードを考慮して説明しましょう:

new get_pendingreq().execute();

この行は実行用の新しいスレッドを作成し、非同期で実行されるため、次の行 (ieSystem.out.print("alalala" + globalVariables.pendingdate.size());) は、非同期を待たずにこの行の直後に実行されます。タスクが完全に実行されるようにするため、この system.print 行を実行後のメソッド内に配置します...

于 2013-03-17T04:35:52.013 に答える
0

確かに、それはglobalVariables.pendingdate.add(e.getString("date"));本当にフィールド「データ」を持っていますか?

于 2013-03-17T04:40:38.523 に答える