httpPost 无法使用 asynctask - 给出无效的索引,大小为 0 异常



为了避免在UI线程中执行与http相关的东西,我将我的代码迁移到asynctask中,在此之前,它在3.0之前的版本上运行良好 - 但是,在字面上复制粘贴代码后,它开始给出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);

我看不到 nameValuePair 变量在任何地方初始化,这实际上会导致问题。

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

希望这会有所帮助,如果你有一些问题,请在这里发布,谢谢......

最新更新