2013-02-11 2 views
3

Im делает программу для Android, которая анализирует тексты JSON из исходного кода веб-страницы в Интернете. Он работает в android 2.2, но мне теперь нужно, чтобы он был на Android 3.0, который должен быть на AsyncTask. У меня есть опыт работы с AsyncTask, но я так запутался, где бы все это и было. Заранее спасибо всем :)setText из разобранного объекта JSON с AsyncTask

Вот мой метод в классе MainActivity:

private void jsonStuffs() { 
    //JSON PARSER & HOME PAGE TEXTVIEWS 

     client = new DefaultHttpClient(); 

     GetMethodEx test = new GetMethodEx(); 
     String returned; 
     try { 
      returned = test.getInternetData(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try{ 
      String jsonStr = test.getInternetData(); //go to GetMethodEx 
       JSONObject obj = new JSONObject(jsonStr); 

//////////////////////find temperature in the JSON in the webpage 

       String temperature = obj.getString("temperature"); 
       TextView tvTemp = (TextView)findViewById(R.id.textView); 
       tvTemp.setText(temperature); 

     } 
     //catch (JSONException e) { 
      // e.printStackTrace(); 
      //} 
     catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
    } 

Класс GetMethodEx это (это будет найти ссылку на веб-страницу, то преобразовать его исходный код в текстовом формате):

public class GetMethodEx extends Activity { 
    public String getInternetData() throws Exception{ 

     BufferedReader in = null; 
     String data = null; 
     // 

     try{ 
      HttpClient client = new DefaultHttpClient(); 
      URI website = new URI("http://nhjkv.comuf.com/json_only.php"); 
      HttpGet request = new HttpGet(); 
      request.setURI(website); 
      HttpResponse response = client.execute(request); 
      in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      StringBuffer sb = new StringBuffer(""); 
      String l = ""; 
      String nl = System.getProperty("line.separator"); 
      while ((l = in.readLine()) !=null){ 
       sb.append(l + nl); 
      } 
      in.close(); 
      data = sb.toString(); 
      return data; 
     }finally { 
      if (in !=null){ 
       try{ 
        in.close(); 
        return data; 
       } catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

Вы получаете 'NetworkOnMainThreadException' право? – Geros

+0

google, прежде чем вы его попросите. – njzk2

ответ

1

он работает в Android версии 2.2, но мне это нужно сейчас, чтобы быть на Android 3.0, , который должен быть на AsyncTask.

=> Да, это дает NetworkOnMainThreadException в 3.0, если вы делаете веб-звонок без реализации внутри Thread, такого как AsyncTask.

У меня есть опыт работы с AsyncTask, но я так смущен, где поставить на это и на то.

=> Просто включите логику веб-вызова внутри doInBackground() способе AsyncTask, в ваших getInternetData случае вызова() внутри doInBackground().

FYI, вы не можете обновлять UI прямолинейно, выполняя долго выполняющуюся задачу внутри doInBackground(). Да, если вы хотите обновить интерфейс, выполните следующие действия:

  1. Обновить пользовательский интерфейс из метода onPostExecute().
  2. или реализовать runOnUiThread() внутри doInBackround()
2

Вы можете сделать что-то вроде этого (этот код является только для иллюстрации, изменить его по мере необходимости)

class MyAsyncTask extends AsyncTask<String, Void, JSONObject> { 
    protected void onPreExecute() { 
     // You can set your activity to show busy indicator 
     //setProgressBarIndeterminateVisibility(true); 
    } 

    protected JSONObject doInBackground(String... args) { 
     return jsonStuffs(); 
    } 

    protected void onPostExecute(final JSONObject jsonObj) { 
     String temperature = jsonObj.getString("temperature"); 
     TextView tvTemp = (TextView)findViewById(R.id.textView); 
     tvTemp.setText(temperature); 
     // Stop busy indicator 
     //setProgressBarIndeterminateVisibility(false); 
    } 

Для вызова этого использование задачи new MyAsyncTask().execute(); (вы можете пройти String параметров, которые необходимо выполнить при необходимости) Вы можете изменить свой jsonStuffs() для возврата JSONObject

, например.

private JSONObject jsonStuffs() { 

    // ... 

    String jsonStr = test.getInternetData(); //go to GetMethodEx 
    return new JSONObject(jsonStr); 

    // ... 
} 
Смежные вопросы