1

UIスレッドでネットワーク関連のものを実行するべきではないことを知っているため、asynctaskを使用して、リモートサーバー上のphpを介してデータベースからいくつかのものを読み取ります。ただし、コードが --HttpResponse response = httpclient.execute(httppost); -- エラーが発生しています -- java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 -- したがって、コードは機能しません。

このように asyncTask を呼び出していることに注意してください -- new dataRetrievalViaAsyncTask().execute(url,url,url); (2 番目と 3 番目の「url」は使用されないためダミーです) -- oncreate() 内。

そこに何が問題なのですか?

class dataRetrievalViaAsyncTask extends AsyncTask<String, String, String>
{
    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... f_url)
    {
        Log.i("tag", "inside doInBackground");
        String url2 = f_url[0];
        Log.i("tag", url2);

        HttpClient httpclient = new DefaultHttpClient();
        Log.i("tag",    "done : HttpClient httpclient = new DefaultHttpClient();");

        HttpPost httppost = new HttpPost(url2);
        Log.i("tag", "done : HttpPost httppost = new HttpPost(url);");

        try
        {

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            Log.i("tag",    "done : httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));");
            HttpResponse response = httpclient.execute(httppost);
            Log.i("tag",    "done : HttpResponse response = httpclient.execute(httppost);");
            HttpEntity entity = response.getEntity();
            Log.i("tag",    "done : HttpEntity entity = response.getEntity();");
            is = entity.getContent();
            Log.i("tag", "after : is = entity.getContent();");

        } catch (Exception e)
        {
            Log.e("log_tag", "Error in http connection" + e.toString());
        }
        // convert response to string
        return "a";

    }

    @Override
    protected void onPostExecute(String result)
    {
               // enter code here

    }
}
4

1 に答える 1

1

さらなる混乱を避けるために、次のようにします。

class dataRetrievalViaAsyncTask extends AsyncTask<String, Void, Void>
{

さらなる変数を使用していないことを示しています。

したがって、次のようにします。

 dataRetrievalViaAsyncTask().execute(url, null, null);

次に、catch ブロックで次のように変更します。

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

その後、適切なスタック トレースを取得し、クラス/メソッド名と行番号を使用してデバッグできることを願っています。

マニフェストに INTERNET 権限があると仮定します。

ArrayIndexOutOfBounds を使用できる唯一の場所は次のとおりです。

 String url2 = f_url[0];

つまり、文字列 URL を ASyncTask に正しく送信していません。

もう 1 つの問題は、nameValuePairs変数を使用していることですが、それがどのようにインスタンス化されるかを示していません。これはあなたの問題です。

于 2012-11-27T22:09:05.663 に答える