2013-05-12 45 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); 
} 

希望這將有助於。