【问题标题】:Trying to fix NetworkOnMainThreadException but gives Toast error尝试修复 NetworkOnMainThreadException 但给出 Toast 错误
【发布时间】:2013-05-26 15:54:41
【问题描述】:

我正在尝试为 java 代码极客中的一个首选示例修复线程错误。

代码如下:

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 错误 (?)。

【问题讨论】:

    标签: android json gson


    【解决方案1】:

    你不能在doInBackground() 中做UI 的事情。因此,您不能在那里显示Toast。您需要将其移至onPostExecute() 或其他地方。可能是onProgressUpdate()

    您可以调用publishProgress(results) 并在onProgressUpdate()return results 中显示ToastonPostExecute() 并在那里显示。您还可以选择将数据发送回Activity 方法

    AsyncTask

    【讨论】:

    • 如果没有其他方法也可以使用处理程序或 runonuithread 方法
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多