来自使用 AsyncTask 解析的 JSON 对象的 setText [重复]

Posted

技术标签:

【中文标题】来自使用 AsyncTask 解析的 JSON 对象的 setText [重复]【英文标题】:setText from a parsed JSON object with AsyncTask [duplicate] 【发布时间】:2013-02-11 08:06:57 【问题描述】:

我正在制作一个从互联网网页源代码解析 JSON 文本的 android 程序。它在 android 2.2 中工作,但我现在需要它在 android 3.0 上,它需要在 AsyncTask 上。我有关于 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();
                
            
        
    

【问题讨论】:

你收到的是NetworkOnMainThreadException 对吧? 在你要求之前先谷歌一下。 【参考方案1】:

您可以这样做(此代码仅用于说明,根据需要更改)

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);

     // ...
 

【讨论】:

【参考方案2】:

它在 android 2.2 中工作,但我现在需要它在 android 3.0 上, 这需要在 AsyncTask 上。

=> 是的,如果您在没有在线程内部实现(例如 AsyncTask)的情况下进行网络调用,它会在 3.0 中提供NetworkOnMainThreadException。

我有 AsyncTask 的背景知识,但我很困惑该放在哪里 这个那个。

=> 只需在 AsyncTask 的 doInBackground() 方法中包含 Web 调用逻辑,在您的情况下,在 doInBackground() 中调用 getInternetData()。

仅供参考,在 doInBackground() 中执行长时间运行的任务时,您无法直接更新 UI。是的,如果您想更新 UI,请遵循以下任一操作:

    从 onPostExecute() 方法更新 UI。 或在doInBackround() 中实现runOnUiThread()

【讨论】:

以上是关于来自使用 AsyncTask 解析的 JSON 对象的 setText [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为 AsyncTask 实现一个常规的 JSON 解析器函数

text 使用AsyncTask和okHttp&JSON解析获取API数据

如何通过 asyncTask 方法解析来自 2 个不同 URL 的数据

AsyncTask #3 解析 JSON 对象时出错。字符串无法转换为 JSONObject

使用 AsyncTask 和 POST 方法将变量发送到服务器并返回 JSON 对象

解析JSON对象的AsyncTask#3错误。 String无法转换为JSONObject