2013-05-12 42 views
0
package com.example.hstnc_activity; 

import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.URL; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.NavUtils; 
import android.util.JsonReader; 
import android.view.MenuItem; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 


public class DisplayServiceActivity extends ListActivity { 
    private ListView listOfServices; 

    //JSONArrays? 
    JSONArray directory = null; 

    //JSON Node names 
    private static String TAG_ID = "id"; 
    private static String TAG_NAME= "name"; 
    private static String TAG_DIRECTORY = "Categories"; 
    private final static String url;  
    JSONObject json; 
    jsonParser jParser = new jsonParser(); 

    @SuppressLint("NewApi") 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     new Request().onPostExecute(url); 

     listOfServices =getListView(); //get builtin listView 


     ArrayList<HashMap<String, String>> directoryList = new ArrayList<HashMap<String, String>>(); 

     // Intent intent = getIntent(); 
     //String url = intent.getStringExtra("SERVICES_DIRECTORY"); 


     try{ 
      //getting Array 
      directory = json.getJSONArray(TAG_DIRECTORY); 

      for(int i= 0; i<directory.length(); i++){ 
       JSONObject addItem =directory.getJSONObject(i); 

       //store each item in variable 
       String id = addItem.getString(TAG_ID); 
       String name= addItem.getString(TAG_NAME); 

       //create new HashMap 
       HashMap<String,String> map = new HashMap<String, String>(); 

       //add each child node to HashMap key 
       map.put(TAG_ID, id); 
       map.put(TAG_NAME, name); 

       //adding HashList to ArrarList 
       directoryList.add(map); 
      } 

     } catch (JSONException e){ 
      e.printStackTrace(); 
     } 

     ListAdapter adapter = new SimpleAdapter(this, 
       directoryList, 
       R.layout.list_item, 
       new String[] { TAG_ID,TAG_NAME }, 
       new int[] { android.R.id.text1,android.R.id.text2 }); 

     setListAdapter(adapter); 
     setContentView(R.layout.service); 
     // Make sure we're running on Honeycomb or higher to use ActionBar APIs 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      // Show the Up button in the action bar. 
      getActionBar().setDisplayHomeAsUpEnabled(true); 
     } 
    }// end of onCreate Method 
    @SuppressWarnings("unused") 
    public class Request extends AsyncTask<Void, Void, Void> { 
     protected Void doInBackground(Void... params) { 
      json = jParser.getJSONfromURL(url); 
      return null; 
     } 
     protected void onPostExecute(String url) { 
      json = jParser.getJSONfromURL(url); 
     } 

    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

我打算在Android中执行JSON请求,并将这些信息放入列表视图中。我在调试时不断收到“HTTP连接错误android.os.NetworkOnMainThreadException”错误。当运行apk时,只需在打开此活动时强制关闭。此活动通过另一个屏幕上的按钮启动。针对json请求的AsycTask问题

回答

2

这是为什么json = jParser.getJSONfromURL(url)onPostExecute()?我假设你只是忘了删除它,因为你也有它在doInBackground(),它应该是

移动要走出那里,因为onPostExecute()UI Thread运行的NetworkOnMainThreadException

我没注意到这对UI做网络的东西运行,但如果有那么它移到doInBackground()

而且,你不应该直接调用onPostExecute()或任何其他AsyncTask方法anyhting。你需要的东西要做得像

Request = new Request(); // can send parameters to constructor if needed 
request.execute(); // execute doInBackground()-- you can pass your url param in here for doInBackground to receive but you have to change the class declaration so that the first param takes a url 

AsyncTask Docs

+0

谢谢,除去从onPostExecute JSON = jParser.getJSONfromURL(URL)()和创建的请求的实例。我不再得到“HTTP连接错误android.os.NetworkOnMainThreadException”但是我得到一个runtimeException:无法启动活动:NullPointerExcpetion。 – user2374128 2013-05-12 03:58:00

1

删除代码从onPostExecute(),它将会运行得很好。

补充订正: - onPostExecute()将永远不会收到参数调用(String url)因为你是从doInBackground等原因返回null是你设置的AsyncTask PARAMS到<Void, Void, Void>这意味着没有PARAMS会通过的AsyncTask接收并没有什么会从doInBackground返回到onPostExecute。

onPostExecute()应该是这样的: -

@Override 
protected void onPostExecute(Void v) {   
    super.onPostExecute(v); 
} 

希望这将有助于。