0

大家好,我的代码需要一些帮助。我想从 Web 服务器获取 JSON 数据,但是当我尝试调用 doInBackground 函数时出现 nullException 错误。

这是我的代码:

public class viewPOI extends ListActivity {
//private ProgressDialog progress;
JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> POIList;
private static String url_webservice = 
    "http://127.0.0.1/locaRemService/db_function.php";
private static final String TAG_SUCCESS = "success";
private static final String TAG_POIN = "point";
private static final String TAG_ALAMAT = "alamat_lokasi";
private static final String TAG_KONTEKS = "konteks_lokasi";
JSONArray POI = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_poi);

    POIList = new ArrayList<HashMap<String, String>>();
    new LoadAllPOI().execute();
    ListView Lpoi = getListView();
}

class LoadAllPOI extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        JSONObject json = jParser.getJSONFromURL(url_webservice, "GET", params);
        Log.d("All Products: ", json.toString());

        try {
            int sukses = json.getInt(TAG_SUCCESS);
            if(sukses == 1) {
                POI = json.getJSONArray(TAG_POIN);
                for(int i = 0; i < POI.length(); i++) {
                    JSONObject c = POI.getJSONObject(i);
                    String alamat = c.getString(TAG_ALAMAT);
                    String konteks = c.getString(TAG_KONTEKS);
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(TAG_ALAMAT, alamat);
                    map.put(TAG_KONTEKS, konteks);
                    POIList.add(map);
                }
            } else {
                Toast.makeText(getApplicationContext(), "Tidak ada lokasi", Toast.LENGTH_SHORT).show();
            }
        } catch(JSONException ex) {
            ex.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(String file_url) {
        //progress.dismiss();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                ListAdapter adapter = new SimpleAdapter(viewPOI.this, POIList, 
                        R.layout.list_item, new String[]{TAG_ALAMAT, TAG_KONTEKS}, 
                        new int[]{R.id.alamatPOI, R.id.konteksPOI});
                setListAdapter(adapter);
            }

        });
    }
}

}

原木猫

04-16 20:06:59.389: ERROR/AndroidRuntime(503): FATAL EXCEPTION: AsyncTask #1
04-16 20:06:59.389: ERROR/AndroidRuntime(503): java.lang.RuntimeException: An error occured while executing doInBackground()
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.lang.Thread.run(Thread.java:1019)
04-16 20:06:59.389: ERROR/AndroidRuntime(503): Caused by: java.lang.NullPointerException
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at com.locationReminder.viewPOI$LoadAllPOI.doInBackground(viewPOI.java:61)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at com.locationReminder.viewPOI$LoadAllPOI.doInBackground(viewPOI.java:1)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-16 20:06:59.389: ERROR/AndroidRuntime(503):     ... 4 more

谢谢你的帮助...

[已解决] 感谢我解决这个问题的每个人。我把url改成10.0.2.2,问题就解决了。谢谢大家...

4

2 回答 2

0

首先,您将 String、String、String 通用参数用于异步任务,因此您需要在执行时传递 String 参数(此处为 String 参数)。您还需要在 doInBackground(String... args) 的末尾为 onPostExecute(String file_url) 返回一个字符串参数。在您的代码中,您只返回 null。

于 2013-04-16T14:20:28.760 回答
0

如果您使用此代码,您的对象可能会因为多种原因之一(没有网络连接、错误的站点、格式错误的 JSON 对象)之一而获得空值。

代替

Log.d("All Products: ", json.toString());

尝试

if (json!=null)
    Log.d("All Products: ", json.toString());

进一步审查:您的

try{...}  catch(JSONException ex) {...}

也会抛出异常,因为您没有json在那里测试空值。所以

 if (json!=null){
    Log.d("All Products: ", json.toString());
     try{...}  catch(JSONException ex) {...}
 }

将是您的实际解决方案。

于 2013-04-16T14:58:29.670 回答