2013-05-26 28 views
1

我試圖修復從Java代碼極客我的首選示例之一線程錯誤。試圖修復NetworkOnMainThreadException,但給吐司錯誤

下面的代碼:

public class JsonParsingActivity extends Activity { 

     String url = "http://search.twitter.com/search.json?q=javacodegeeks"; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      new RetreiveFeedTask().execute(url); 

     } 
    } 

的RetrieveFeedTask:

public class RetreiveFeedTask extends 
     AsyncTask<String, Void, JsonParsingActivity> { 

    private Exception exception; 
    String url = "http://search.twitter.com/search.json?q=javacodegeeks"; 

    protected JsonParsingActivity doInBackground(String... urls) { 
     try { 

      InputStream source = retrieveStream(url); 

      Gson gson = new Gson(); 

      Reader reader = new InputStreamReader(source); 

      SearchResponse response = gson.fromJson(reader, SearchResponse.class); 

      // Toast.makeText(this, response.query, Toast.LENGTH_SHORT).show(); 

      List<Result> results = response.results; 

      for (Result result : results) { 
       Toast.makeText(JsonParsingActivity.class, result.fromUser, Toast.LENGTH_SHORT).show(); 
      } 

     } catch (Exception e) { 
      this.exception = e; 
      return null; 
     } 
    } 

    protected void onPostExecute(JsonParsingActivity feed) { 
     // TODO: check this.exception 
     // TODO: do something with the feed 
    } 

    private InputStream retrieveStream(String url) { 

     DefaultHttpClient client = new DefaultHttpClient(); 

     HttpGet getRequest = new HttpGet(url); 

     try { 

      HttpResponse getResponse = client.execute(getRequest); 
      final int statusCode = getResponse.getStatusLine().getStatusCode(); 

      if (statusCode != HttpStatus.SC_OK) { 
       Log.w(getClass().getSimpleName(), "Error " + statusCode 
         + " for URL " + url); 
       return null; 
      } 

      HttpEntity getResponseEntity = getResponse.getEntity(); 
      return getResponseEntity.getContent(); 

     } catch (IOException e) { 
      getRequest.abort(); 
      Log.w(getClass().getSimpleName(), "Error for URL " + url, e); 
     } 

     return null; 

    }} 

怎樣做,如果沒有錯誤的最好方法? 它目前正在發出Toast錯誤(?)。

回答

7

你不能做UI東西在doInBackground()。因此,您不能在那裏顯示Toast。您需要將其移至onPostExecute()或其他地方。可能onProgressUpdate()

您能夠打電話publishProgress(results),並顯示在onProgressUpdate()Toastreturn resultsonPostExecute()並顯示它。您還可以發送數據回到一個Activity方法

AsyncTask

+1

如果沒有別的辦法,你可以使用處理器或runonuithread方法太 – stinepike

+0

感謝,@codeMagic和StinePike的選項。 – user2103505

+0

什麼都沒有。照常。 – Blackbelt