2013-05-26 25 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