2013-07-02 2 views
-1

У меня есть код от Android Hive, чтобы разобрать данные JSON с URL-адреса. Затем я пытаюсь реализовать тот же код на Rotten Tomatoes Upcoming Movies Api. Я реализовал тот же код, практически изменяя все файлы xml в соответствии с моими потребностями. Но проблема в том, что я пытаюсь запустить код, показывая NetworkOnMainThread Exception.Исключение NetworkOnMainThread

Это мой код ..

public class Upcoming extends ListActivity 
{ 

String url = "http://api.rottentomatoes.com/api/public/v1.0/lists/movies/upcoming.json?apikey=yvvgsv722gy2zkey3ebkda5t"; 

final String TAG_MOVIES = "movies"; 
final String TAG_ID = "id"; 
final String TAG_TITLE = "title"; 
final String TAG_YEAR = "year"; 
final String TAG_MPAA_RATING = "mpaa_rating"; 
final String TAG_RUNTIME = "runtime"; 
final String TAG_RELEASE_DATES = "release_dates"; 
final String TAG_RATINGS = "ratings"; 
final String TAG_CRITIC_RATING = "critics_ratings"; 
final String TAG_AUDIENCE_RATING = "audience_ratings"; 
final String TAG_SYNOPSIS = "synopsis"; 
final String TAG_POSTERS = "posters"; 

JSONArray upcomings = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_upcoming_list); 

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


// Creating JSON Parser instance 
    JSONParser jParser = new JSONParser(); 

    // getting JSON string from URL 
    JSONObject json = jParser.getJSONFromUrl(url); 

    try { 
     // Getting Array of Contacts 
     upcomings = json.getJSONArray(TAG_MOVIES); 

     // looping through All Contacts 
     for(int i = 0; i < upcomings.length(); i++){ 
      JSONObject c = upcomings.getJSONObject(i); 

      // Storing each json item in variable 
      String id = c.getString(TAG_ID); 
      String title = c.getString(TAG_TITLE); 
      String year = c.getString(TAG_YEAR); 
      String mpaa_rating = c.getString(TAG_MPAA_RATING); 
      String runtime = c.getString(TAG_RUNTIME); 

      JSONObject release_dates = c.getJSONObject(TAG_RELEASE_DATES); 
      JSONObject ratings = c.getJSONObject(TAG_RATINGS); 
      String critic_rating = c.getString(TAG_CRITIC_RATING); 
      String audience_rating = c.getString(TAG_AUDIENCE_RATING); 
      String synopsis = c.getString(TAG_SYNOPSIS); 
      JSONObject posters = c.getJSONObject(TAG_POSTERS); 


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

      map.put(TAG_TITLE, title); 
      map.put(TAG_YEAR, year); 
      map.put(TAG_CRITIC_RATING, critic_rating); 
      map.put(TAG_AUDIENCE_RATING, audience_rating); 

      UpcomingList.add(map); 

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

    ListAdapter adapter = new SimpleAdapter(this, UpcomingList, 
      R.layout.activity_upcoming, 
      new String[] { TAG_TITLE, TAG_YEAR, TAG_CRITIC_RATING, TAG_AUDIENCE_RATING }, new int[] 
        { 
        R.id.title, R.id.year, R.id.critic_rating, R.id.audience_rating }); 

    setListAdapter(adapter); 

    // selecting single ListView item 
    ListView lv = getListView(); 

    // Launching new screen on Selecting Single ListItem 
    lv.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting values from selected ListItem 
      String name = ((TextView) view.findViewById(R.id.title)).getText().toString(); 
      String cost = ((TextView) view.findViewById(R.id.year)).getText().toString(); 
      String critic_rating = ((TextView) view.findViewById(R.id.critic_rating)).getText().toString(); 
      String audience_rating = ((TextView) view.findViewById(R.id.audience_rating)).getText().toString(); 

      // Starting new intent 
      Intent in = new Intent(getApplicationContext(), Upcoming.class); 
      in.putExtra(TAG_TITLE, name); 
      in.putExtra(TAG_YEAR, cost); 
      in.putExtra(TAG_CRITIC_RATING, critic_rating); 
      in.putExtra(TAG_AUDIENCE_RATING, audience_rating); 
      startActivity(in); 
     } 
    }); 
} 


} 

Может кто-нибудь, пожалуйста, помогите мне что-нибудь мне не хватает.? Теперь я полностью ослеп. Thanx заранее.

+0

http://www.google.co.in/#q=NetworkOnMainThreadexception&spell=1&sa=X&ei=ILTSUeKIBIamrQfrgYGgAg&ved= 0CCcQvwUoAA & БАВ = on.2, or.r_qf. & BVM = bv.48705608, d.bmk & Fp = 454708d46e718598 & BIW = 1152 & БиГ = 608 –

ответ

0

Вы разобрались в главной теме пользовательского интерфейса. вот почему это порождает ошибку. Для этого вы должны использовать runOnUiThread или AsycTask.

JSONObject json = jParser.getJSONFromUrl(url); 

положить выше линии, как показано ниже:

loadingDialog = ProgressDialog.show(youractivity.this, "", "Loading...", true, false); 
new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        Thread.sleep(5000); 
        runOnUiThread(new Runnable() { 
         public void run() { 
               loadingDialog.dismiss(); 
               JSONObject json = jParser.getJSONFromUrl(url); 
              } 
        }); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      } 
     }).start(); 
0

Пожалуйста, введите код процесса подключения к Интернету в ASyncTask или в другой теме. Поскольку ICS и Jelly Bean не позволяют вам делать интернет-процесс на основной теме.

2

Не использовать сетевое подключение в главном потоке (UI Thread) использовать Asyntask или нити, чтобы сделать.

0

Не выполняйте свои запросы HTTP в пользовательском интерфейсе/главной теме - ваш синхронный http блокирует, и для этого блокировка фактических чертежей и макетов проходит на экране.

Выполнение http в ответ на события пользовательского интерфейса, например, вы пытаетесь сделать это обычным в Android, они изобрели удивительный помощник под названием AsyncTask.

Создайте анонимный экземпляр этого класса с внутренней ссылкой на класс Activity (т. Е. На практике определите класс внутри вашей деятельности и не сделайте его статическим).

Из приведенных выше документы:

Когда асинхронная задача выполняется, задача проходит через ...

doInBackground (Params ...), вызывается на фоновом потоке сразу после onPreExecute () завершает выполнение. Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. ...

onPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения вычисления фона. Результат вычисления фона передается на этот шаг в качестве параметра.

[У меня есть дополнительные сведения, также мой акцент].

Ваш адаптер должен ссылаться на задачу async, которая передает информацию из блока кода, выполняемого всеми вашими синхронными HTTP-запросами в ней из потока пользовательского интерфейса, в блок кода в потоке пользовательского интерфейса, который можно использовать для касания его представлений (здесь вы обновляете свой список).

Лучшие,

Tom.

1

использование AsyncTask

для примера: -

class YourTask extends AsyncTask<URL, Integer, String> { 
protected String doInBackground(URL... urls) { 
    // Fetch Data (Task A) 
    return "Result"; 
} 

protected void onProgressUpdate(Integer... progress) { 
    // Show progress 
} 

protected void onPostExecute(String result) { 
    // Show UI after complete (Task B) 
} 
} 

или

добавить ниже кода в OnCreate() метод отключить строгий режим используя следующий код :

это не решение, но избегает сети IO на главном потоке поэтому я рекомендую AsyncTask

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 
Смежные вопросы