执行doInBackground()时发生java.lang.RuntimeException错误

时间:2012-12-17 07:59:23

标签: android

我是android开发的初学者,在下面的代码中得到错误。我正在调用http请求的asyn方法。它给我java.lang.RuntimeException错误执行doInBackground()

private class PostAlert extends AsyncTask<String, Integer, JSONArray>{

    private ProgressDialog progressDialog;

    @Override
    protected JSONArray doInBackground(String... params) {
        // TODO Auto-generated method stub
        JSONArray menuitemArr = null;
        String url=params[0];

        System.out.println("fsfsddddf"+params[0]);
        ControlDashboard obj = new ControlDashboard();
        try{
        JSONObject aobj = obj.getJSONFromUrl(url);

            JSONObject array = aobj.getJSONObject("alert_list");    
             menuitemArr = array.getJSONArray("array");

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

        return menuitemArr;
    }

    @Override
    protected void onPostExecute(JSONArray menuitemArr) {
        // TODO Auto-generated method stub
        super.onPostExecute(menuitemArr);
        if (menuitemArr.length() == 0) {
            startActivity(new Intent("com.example.mysampleapp.ABOUT"));
            //Toast.makeText(Alert.this, "No Alerts", Toast.LENGTH_LONG).show();
        }else{
        name = new String[menuitemArr.length()];
        alert = new String[menuitemArr.length()];
        date = new String[menuitemArr.length()];
        for (int i = 0; i < menuitemArr.length(); i++) { 
            // printing the values to the logcat 
            try {
                name[i] =  menuitemArr.getJSONObject(i).getString("name").toString();
                alert[i] = menuitemArr.getJSONObject(i).getString("message").toString(); 
                date[i] = menuitemArr.getJSONObject(i).getString("date").toString();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 

        } 
        ListView list = (ListView) findViewById(R.id.listView3);
        ArrayList<HashMap<String, String>> mylistData = new ArrayList<HashMap<String, String>>();
        String[] columnTags = new String[] {"col1", "col2", "col3"};
        int[] columnIds = new int[] {R.id.alert1, R.id.alert2, R.id.alert3};
        for(int i=0; i<name.length; i++)
        {
         HashMap<String,String> map = new HashMap<String, String>();
             map.put("col1", name[i]);
             map.put("col2", alert[i]);
             map.put("col3", date[i]);
         mylistData.add(map);
        }
        SimpleAdapter arrayAdapter = new SimpleAdapter(Alert.this, mylistData, R.layout.alert_view,columnTags,columnIds);
        list.setAdapter(arrayAdapter);      
        }
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        progressDialog = new ProgressDialog(Alert.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage("please wait...");
        progressDialog.setCancelable(false);
        progressDialog.setIndeterminate(false);
        progressDialog.setMax(100);
        progressDialog.setProgress(0);
        progressDialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
        //progressDialog.dismiss();
    }



}

运行我的Android应用程序时出错。

12-17 13:22:48.035: W/dalvikvm(1160): threadid=8: thread exiting with uncaught exception (group=0x4001d800)
12-17 13:22:48.045: E/AndroidRuntime(1160): FATAL EXCEPTION: AsyncTask #2
12-17 13:22:48.045: E/AndroidRuntime(1160): java.lang.RuntimeException: An error occured while executing doInBackground()
12-17 13:22:48.045: E/AndroidRuntime(1160):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-17 13:22:48.045: E/AndroidRuntime(1160):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-17 13:22:48.045: E/AndroidRuntime(1160):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-17 13:22:48.045: E/AndroidRuntime(1160):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-17 13:22:48.045: E/AndroidRuntime(1160):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)

json请求类:

public class ControlDashboard extends Activity {
    public static DefaultHttpClient httpClient;

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            jObj = null;
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }



}

2 个答案:

答案 0 :(得分:3)

 startActivity(new Intent("com.example.mysampleapp.ABOUT"));

   ListView list = (ListView) findViewById(R.id.listView3);

这里你试图从背景线程中访问UI元素,这意味着从AsyncTask doInBackground这是不可能的

解决方案移动onPostExecute中所有与ui相关的代码,以便在doInBackground完成后更新ui

您可以在此处看到我们如何在onPostExecute执行完成后doInBackground更新用户界面

编辑:或只使用此PostAlert AsyncTask类:

private class PostAlert extends AsyncTask<String, Integer, JSONArray>{

        private ProgressDialog progressDialog;

        @Override
        protected JSONArray doInBackground(String... params) {
            // TODO Auto-generated method stub
           JSONArray menuitemArr=null;
            String url=params[0];
            System.out.println("fsfsddddf"+url);

        //  System.out.println("fsfsddddfobj"+obj);
            try{

            JSONObject aobj = obj.getJSONFromUrl(url);
            System.out.println("fsfsf"+aobj);

                JSONObject array = aobj.getJSONObject("alert_list");    
                menuitemArr = array.getJSONArray("array");

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

        @Override
        protected void onPostExecute(JSONArray menuitemArr) {
            // TODO Auto-generated method stub

                if (menuitemArr.length() == 0) {
                    startActivity(new Intent("com.example.mysampleapp.ABOUT"));
                    //Toast.makeText(Alert.this, "No Alerts", Toast.LENGTH_LONG).show();
                }else{
                name = new String[menuitemArr.length()];
                System.out.println("name"+name);
                alert = new String[menuitemArr.length()];
                date = new String[menuitemArr.length()];
                for (int i = 0; i < menuitemArr.length(); i++) { 
                    // printing the values to the logcat 
                    name[i] =  menuitemArr.getJSONObject(i).getString("name").toString(); 
                    alert[i] = menuitemArr.getJSONObject(i).getString("message").toString(); 
                    date[i] = menuitemArr.getJSONObject(i).getString("date").toString();
                } 
                ListView list = (ListView) findViewById(R.id.listView3);
                ArrayList<HashMap<String, String>> mylistData = new ArrayList<HashMap<String, String>>();
                String[] columnTags = new String[] {"col1", "col2", "col3"};
                int[] columnIds = new int[] {R.id.alert1, R.id.alert2, R.id.alert3};
                for(int i=0; i<name.length; i++)
                {
                 HashMap<String,String> map = new HashMap<String, String>();
                     map.put("col1", name[i]);
                     map.put("col2", alert[i]);
                     map.put("col3", date[i]);
                 mylistData.add(map);
                }
                SimpleAdapter arrayAdapter = new SimpleAdapter(Alert.this, mylistData, R.layout.alert_view,columnTags,columnIds);
                list.setAdapter(arrayAdapter);      
                } 
            }

            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            progressDialog = new ProgressDialog(Alert.this);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressDialog.setMessage("please wait...");
            progressDialog.setCancelable(false);
            progressDialog.setIndeterminate(false);
            progressDialog.setMax(100);
            progressDialog.setProgress(0);
            progressDialog.show();
            System.out.println("fsgsgsg");
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            progressDialog.setProgress(values[0]);  
        }



    }
}

http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:1)

您正在后台设置ListAdapter,因为它是UI线程任务,所以不应该这样做。将doInBackground()中的整个代码更改为onPostExecute()getJsonFromUrl(url)除外。你可以从doInBackground()返回jsonobject,你可以在onPostExecute()作为结果参数。您仍然可以在onPostExecute()中获得运行时错误,然后在

中找到此行listview.setAdapter()
runOnUIThread(new Runnable(){
public void run()
{

}
});

我希望它清楚,它会对你有用。