【问题标题】:Error in http connection in androidandroid中的http连接错误
【发布时间】:2012-06-07 11:23:38
【问题描述】:

我收到此错误。我不知道出了什么问题。有人可以帮我吗?搜了一下,不知道怎么解决……有点急。

这是我的代码:

   package nearest.moskee.almawada;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Locale;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.location.Address;
import android.location.Geocoder;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;

import com.google.android.maps.GeoPoint;

public class MoskeeJSON extends Activity {
    private Handler mHandler = new Handler(Looper.getMainLooper());
    String url;
    HttpClient httpclient;
    InputStream is = null;

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

        ProgressDialog mProgressDialog;

        @Override
        protected void onPostExecute(Void result) {
            mProgressDialog.dismiss();
        }

        @Override
        protected void onPreExecute() {
            mProgressDialog = ProgressDialog.show(MoskeeJSON.this,
                    "Loading...", "Data is Loading...");

        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                HttpPost httppost = new HttpPost(url);
                //HttpGet httppost = new HttpGet(url);
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
                Log.e("url", url);
            } catch (Exception e) {
                Log.e("log_tag", "Error in http connection " + e.toString());
            }

            return null;
        }

    }

    public JSONArray getCloseMosquesInJSON(float lat, float lng, float radius) {

        String result = "";

        try {
            httpclient = new DefaultHttpClient();
            url = "http://www.moskee.org/finder/getCloseDataInJSON.php?lat="
                    + lat + "&lng=" + lng + "&radius=" + radius;
            new MyAsyncTask().execute();
            Log.v("URL =>", url);

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

        // convert response to string
        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();
            Log.e("result", result);
            Log.e("resultLength", result.length() + "");
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }
        // parse json data
        if (result.length() == 5) {
            Log.i("result is ", "LEEG");
            return null;
        } else {
            JSONArray jArray = null;
            try {
                jArray = new JSONArray(result);
            } catch (JSONException e) {
                Log.e("log_tag", "Error parrsing data " + e.toString());
            }

            return jArray;
        }
    }

    JSONObject jsonObject;
    StringBuilder stringBuilder;

}

错误

06-07 15:04:07.329: I/dalvikvm(1643): threadid=3: 对信号 3 做出反应 06-07 15:04:07.370: I/dalvikvm(1643): 将堆栈跟踪写入 '/data/anr/traces.txt' 06-07 15:04:07.828: I/dalvikvm(1643): threadid=3: 对信号 3 做出反应 06-07 15:04:07.898: I/dalvikvm(1643): 将堆栈跟踪写入 '/data/anr/traces.txt' 06-07 15:04:07.988: D/gralloc_goldfish(1643):没有检测到 GPU 仿真的仿真器。 06-07 15:04:24.098: D/InputEventConsistencyVerifier(1643): KeyEvent: ACTION_UP 但键未按下。 06-07 15:04:24.098: D/InputEventConsistencyVerifier(1643):在 android.widget.EditText@412aa7f0 06-07 15:04:24.098: D/InputEventConsistencyVerifier(1643):0:在 16907476000000 发送, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_TAB, scanCode=15, 元状态=0,标志=0x8,重复计数=0,事件时间=16907476, 停机时间 = 16907424,设备 ID = 0,源 = 0x301} 06-07 15:04:24.098: D/InputEventConsistencyVerifier(1643): -- 最近的事件 -- 06-07 15:04:24.098: D/InputEventConsistencyVerifier(1643): 1: 发送于 16902546208000,MotionEvent {动作=ACTION_UP,id[0]=0,x[0]=229.0, y[0]=2.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0,edgeFlags=0x0,pointerCount=1,historySize=0, eventTime=16902546,downTime=16902470,deviceId=0,source=0x1002 } 06-07 15:04:24.098: D/InputEventConsistencyVerifier(1643): 2: 发送 在 16902470916000, MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=229.0, y[0]=2.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=16902470,downTime=16902470,deviceId=0,source=0x1002 } 06-07 15:04:27.649: V/Adres =>(1643): Pierenbergstraat, Antwerpen 06-07 15:04:27.649: V/IL GeoPoint 纬度 =>(1643): 51.18809127807617 06-07 15:04:27.669: V/IL GeoPoint 经度 =>(1643): 4.380319118499756 06-07 15:04:27.679: E/GA(1643): GA 06-07 15:04:28.219: I/dalvikvm(1643): threadid=3: 对信号 3 做出反应 06-07 15:04:28.339:I/dalvikvm(1643):将堆栈跟踪写入 '/data/anr/traces.txt' 06-07 15:04:28.419: D/dalvikvm(1643): GC_CONCURRENT 释放 192K,3% 释放 9323K/9607K,暂停 7ms+6ms 06-07 15:04:28.419:W/CursorWrapperInner(1643):光标最终确定,没有 之前的 close() 06-07 15:04:28.419: W/CursorWrapperInner(1643): 光标 没有事先关闭()06-07 15:04:28.719:I / dalvikvm(1643): threadid=3: 对信号 3 做出反应 06-07 15:04:28.719: D/dalvikvm(1643): GC_FOR_ALLOC 释放 54K,3% 释放 9653K/9927K,暂停 54ms 06-07 15:04:28.829: I/dalvikvm(1643): 将堆栈跟踪写入 '/data/anr/traces.txt' 06-07 15:04:28.909: E/log_tag(1643): 错误 http 连接 java.lang.NullPointerException 06-07 15:04:28.909: E/log_tag(1643): 转换结果错误 java.lang.NullPointerException 06-07 15:04:28.909: E/log_tag(1643): 解析数据 org.json.JSONException 时出错:字符输入结束 06-07 15:04:29.110 的 0:I/Center 地图?(1643):51188091,4380319 06-07 15:04:29.110:I/Center 地图?(1643):Toegepast zonder erreurs 06-07 15:04:29.259: I/dalvikvm(1643): threadid=3: 对信号 3 做出反应 06-07 15:04:29.370:I/dalvikvm(1643):将堆栈跟踪写入 '/data/anr/traces.txt' 06-07 15:04:29.649: I/MapActivity(1643): 处理网络更改通知:CONNECTED 06-07 15:04:29.649: E/MapActivity(1643):无法获取连接工厂客户端 06-07 15:04:29.810: I/dalvikvm(1643): threadid=3: 对信号 3 做出反应 06-07 15:04:29.910:I/dalvikvm(1643):将堆栈跟踪写入 '/data/anr/traces.txt' 06-07 15:04:30.089: D/dalvikvm(1643): GC_FOR_ALLOC 释放 32K,3% 释放 9946K/10183K,暂停 59ms 06-07 15:04:30.229: I/dalvikvm(1643): threadid=3: 对信号 3 做出反应 06-07 15:04:30.389:I/dalvikvm(1643):将堆栈跟踪写入 '/data/anr/traces.txt' 06-07 15:04:31.499: D/dalvikvm(1643): GC_CONCURRENT 释放 99K,释放 2% 10360K/10567K,暂停 8ms+7ms

Moskee结果

     package nearest.moskee.almawada;

import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class MoskeeResults extends MapActivity {
    MapView mapView;
    MapController mc;
    GeoPoint p;

    @SuppressWarnings("unused")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mapView = (MapView) findViewById(R.id.myMap);
        mapView.setBuiltInZoomControls(true);

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(
                R.drawable.iconmoskee);
        OverlayItems itemizedoverlay = new OverlayItems(drawable,this);

        try {
            MoskeeJSON m = new MoskeeJSON();

            Bundle extras = getIntent().getExtras();
            float lat = 0;
            float lng = 0;
            float radius = 1;
            lat = (float) extras.getDouble("lat");
            lng = (float) extras.getDouble("lng");


            JSONArray arrMosques = m.getCloseMosquesInJSON(lat, lng, radius);


            if (arrMosques != null) {
                Log.i("Array aangemaakt", "Array is aangemaakt, het bevat "
                        + arrMosques.length() + " moskeëen");
                for (int i = 0; i < arrMosques.length(); i++) {
                    JSONObject row;
                    row = arrMosques.getJSONObject(i);
                    double jlat = row.getDouble("Latitude");
                    double jlng = row.getDouble("Longitude");
                    OverlayItem overlayitem = new OverlayItem(new GeoPoint(
                            (int) (jlat * 1e6), (int) (jlng * 1e6)),
                            row.getString("Naam"), row.getString("Straat"));
                    itemizedoverlay.addOverlay(overlayitem);
                    Log.i("=>", "Another mosque is added to the map");

                }
                Log.i("Array aangemaakt", "Array is aangemaakt, het bevat "
                        + arrMosques.length() + " moskeëen");
                AlertDialog alert = new AlertDialog.Builder(this)
                        .setTitle("Aantal gevonden moskeëen")
                        .setMessage(
                                "Er zijn " + arrMosques.length()
                                        + " moskeëen gevonden in deze straal")
                        .create();
                alert.show();
            } else {
                AlertDialog alert = new AlertDialog.Builder(this)
                        .setTitle("Aantal gevonden moskeëen")
                        .setMessage(
                                "Er zijn geen moskeëen gevonden in deze straal.\nProbeer opnieuw te zoeken met een groter bereik")
                        .create();
                alert.show();
            }


            mapOverlays.add(itemizedoverlay);

            mc = mapView.getController();

            GeoPoint center = new GeoPoint((int) (lat * 1e6), (int) (lng * 1e6));
            Log.i("Center map?", "" + (int) (lat * 1e6) + ","
                    + (int) (lng * 1e6));
            mc.setCenter(center);
            Log.i("Center map?", "Toegepast zonder erreurs");
            mc.setZoom(17);

        } catch ( JSONException e) {
            // TODO Auto-generated catch block
            Log.i("JASOEN EXCEPTIOEN",
                    "I have absolutely no idea what's going on..."
                            + e.getMessage());
            e.printStackTrace();
        }
    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }

}

【问题讨论】:

  • MoskeeResults.java 的第 87 行是什么?
  • 第 86-87 行:Log.i("Array aangemaakt", "Array is aangemaakt, het bevat " + arrMosques.length() + " moskeëen");
  • 您在此处粘贴的代码中不包含此代码。无论如何,变量arrMosques 为空。
  • 怎么可能是空的?我检查了 php 文件,我把所有东西都找回来了
  • 因为 getCloseMosquesInJSON 在某些情况下可能会返回 null!

标签: android json http


【解决方案1】:

正如您指出的错误在您记录的行中。

JSONArray arrMosques = m.getCloseMosquesInJSON(lat, lng, radius);
Log.i("Array aangemaakt", "Array is aangemaakt, het bevat " + arrMosques.length() + " moskeëen");

正如您之前调用 m.getCloseMosquesInJson() 一样,此方法可能会在以下代码块中返回 null:

if (result.length() == 5) {
    Log.i("result is ", "LEEG");
    return null; // HERE
} else {
    JSONArray jArray = null;
    try {
        jArray = new JSONArray(result);
    } catch (JSONException e) {
        Log.e("log_tag", "Error parrsing data " + e.toString());
    }
    return jArray; // HERE! might be null when JSONException was thrown
}

您应该在记录数组长度之前检查null

【讨论】:

  • 好吧,现在检查一下并尝试解决它。我会告诉你进展如何!!
  • 就在它下面,我有: if (arrMosques != null) //... else ... 我确实像你说的那样:我在 else 之后登录了。但我一直有同样的期望。我是不是做错了什么?
  • 如果 arrMosques 为 null 并且在尝试记录 null 后检查它失败并出现 NullPointerException,则无法记录。因此,只需在检查 null 之后执行 Log。
  • if (arrMosques != null) { ... } else{ ... }
  • 然后 Log.i("Array aangemaakt", "Array is aangemaakt, het bevat " + arrMosques.length() + " moskeëen");
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 2016-01-12
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多