0

UIスレッドでhttp関連のものを実行しないようにするために、コードをasynctask内に移行しました。それ以前は、3.0より前のバージョンでは正常に動作していましたが、asynctask内のコードを文字通りコピーして貼り付けた後、invalid index, size is 0 exception. メソッドを使用する必要があるときはいつでも、呼び出しを適用しています-

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

何が悪いの?

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

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
    }

    @Override
    protected Void 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);   
        }
        // convert response to string
        return null;


    }
    protected void onPostExecute()
    {
        try
        {
            Log.i("tag","before : BufferedReader reader = new BufferedReader(new Inp");
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            sb = new StringBuilder();
            sb.append(reader.readLine() + "\n");

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

        try
        {
            Log.i("tag", "before : jsons ");
            jArray = new JSONArray(result);
            JSONObject json_data = null;

            Log.i("tag", Integer.toString(jArray.length()));

            for (int i = 0; i < jArray.length(); i++)
            {
                json_data = jArray.getJSONObject(i);

                uid = json_data.getInt("uid");
                item1= json_data.getString("item1");
                item2 = json_data.getString("item2");
                item3 = json_data.getString("item3");
                item4 = json_data.getString("item4");
                item5 = json_data.getString("item5");
                item6 = json_data.getString("item6");
                favorited = json_data.getString("favorited");

                currentList.add(new itemClass(uid, item1 item2)); //there is a constructor for this in the itemClass

                itemClass toSendToOffline = new itemsClass(uid, item1, item2, item3, item4, item5, item6, favorited);
                myDBHelper.insertFromOnlineToDBtoSendToOffline();

            }



        } catch (JSONException e1)
        {
            Toast.makeText(getBaseContext(), "Not Found", Toast.LENGTH_LONG).show();
        } catch (ParseException e1)
        {
            e1.printStackTrace();
        }
        super.onPostExecute(null);
    }
}

(主にコードは -- で停止しています。

HttpResponse response = httpclient.execute(httppost);
4

2 に答える 2

0

実際に問題を引き起こしている nameValuePairs 変数がどこにも初期化されていません。

于 2012-11-28T10:33:38.950 に答える
0
   class dataRetrievalViaAsyncTask extends AsyncTask<Void, Void, String>
{
    String URL = "";

    public dataRetrievalViaAsyncTask( String url )
        {
            URL = url;
        }

    @Override
    protected void onPreExecute()
        {
        }

    @Override
    protected String doInBackground(Void... f_url)
        {
            String result="";
            try
                {
                    result=fetchdataFromServer(URL);
                }
            catch (JSONException e)
                {
                    e.printStackTrace();
                }
            return result;
        }

    protected void onPostExecute(String result)
        {
            // See your results as string //result
        }

    public JSONObject getJsonObjectToRequestToServer(String plid) throws JSONException
        {
            JSONObject parms = new JSONObject();
            parms.put("user_id", "");
            parms.put("app_key", "xyz");
            parms.put("secret", "abc");
            parms.put("token", "");
            parms.put("playurl", "1");
            parms.put("mode", "playlistdetail");
            parms.put("playlist_id", plid);
            return parms;
        }

    public String fetchdataFromServer(String url) throws JSONException
        {
            String stringresponce = null;
            try
                {
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(URL);

                    JSONObject parms = getJsonObjectToRequestToServer("1");

                    StringEntity se;

                    se = new StringEntity(parms.toString());
                    httpPost.setEntity(se);

                    httpPost.setHeader("Content-type", "application/json");

                    @SuppressWarnings("rawtypes")
                    ResponseHandler responseHandler = new BasicResponseHandler();
                    stringresponce = httpClient.execute(httpPost, responseHandler);
                }
            catch (UnsupportedEncodingException e)
                {
                    e.printStackTrace();
                }
            catch (ClientProtocolException e)
                {
                    e.printStackTrace();
                }
            catch (IOException e)
                {
                    e.printStackTrace();
                }
            return stringresponce;
        }
    }

このコードをコードに入れ、必要な引数を渡します。これは、サーバーに要求し、結果変数から文字列としてjson応答を取得する方法です。jsonオブジェクトを作成して渡した引数をURLに渡し、それらを文字列に変換します

次に、このように実行します............

dataRetrievalViaAsyncTask asyncTask=new dataRetrievalViaAsyncTask(Yoururl);
asyncTask.execute();

問題が発生した場合は、ここに投稿してください。

于 2012-11-28T10:02:09.447 に答える