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

Android 执行doInBackground()时发生java.lang.RuntimeException错误,android,Android,我是android开发的初学者,在下面的代码中遇到了错误。我正在为http请求调用asyn方法。它给我java.lang.RuntimeException错误,在执行doInBackground()时发生 json请求类: public class ControlDashboard extends Activity { public static DefaultHttpClient httpClient; static InputStream is = null; st

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

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;

    }



}

您正在后台设置ListAdapter,这是一项UI线程任务,不应执行。将
doInBackground()
中的整个代码更改为
onPostExecute()
,除了
getJsonFromUrl(url)
之外。您可以从
doInBackground()
返回jsonobject,您可以在
onPostExecute()
中获取它作为结果参数。仍然会在
onPostExecute()
中出现运行时错误,然后只需在中更正这一行
listview.setAdapter()

runOnUIThread(new Runnable(){
public void run()
{

}
});

我希望它清晰明了,对您有用。

您正在后台设置ListAdapter,这不应该做,因为这是UI线程任务。将
doInBackground()
中的整个代码更改为
onPostExecute()
,除了
getJsonFromUrl(url)
之外。您可以从
doInBackground()
返回jsonobject,您可以在
onPostExecute()
中获取它作为结果参数。仍然会在
onPostExecute()
中出现运行时错误,然后只需在中更正这一行
listview.setAdapter()

runOnUIThread(new Runnable(){
public void run()
{

}
});
 startActivity(new Intent("com.example.mysampleapp.ABOUT"));
我希望它清晰明了,对你有用

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

在这里,您试图从后台线程方式从AsyncTask
doInBackground
访问UI元素,这是不可能的

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

您可以在这里看到当
doInBackground
执行完成后,我们如何从
onPostExecute
更新UI

编辑:或仅使用此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]);  
        }



    }
}
私有类PostAlert扩展异步任务{
私有进程对话;
@凌驾
受保护的JSONArray doInBackground(字符串…参数){
//TODO自动生成的方法存根
JSONArray menuitemArr=null;
字符串url=params[0];
System.out.println(“fsfsddf”+url);
//System.out.println(“fsfsddfobj”+obj);
试一试{
JSONObject aobj=obj.getJSONFromUrl(url);
System.out.println(“fsfsf”+aobj);
JSONObject数组=aobj.getJSONObject(“警报列表”);
menuitemArr=array.getJSONArray(“数组”);
捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}       
返回menuitemArr;
}
@凌驾
受保护的void onPostExecute(JSONArray menuitemArr){
//TODO自动生成的方法存根
如果(menuitemArr.length()==0){
startActivity(新意图(“com.example.mysampleapp.ABOUT”);
//Toast.makeText(Alert.this,“无警报”,Toast.LENGTH_LONG.show();
}否则{
name=新字符串[menuitemArr.length()];
System.out.println(“名称”+名称);
alert=新字符串[menuitemArr.length()];
日期=新字符串[menuitemArr.length()];
对于(int i=0;i
在这里,您试图从后台线程方式从AsyncTask
doInBackground
访问UI元素,这是不可能的

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

您可以在这里看到当
doInBackground
执行完成后,我们如何从
onPostExecute
更新UI

编辑:或仅使用此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]);  
        }



    }
}
私有类PostAlert扩展异步任务{
私有进程对话;
@凌驾
受保护的JSONArray doInBackground(字符串…参数){
//TODO自动生成的方法存根
JSONArray menuitemArr=null;
字符串url=params[0];
System.out.println(“fsfsddf”+url);
//System.out.println(“fsfsddfobj”+obj);
试一试{
JSONObject aobj=obj.getJSONFromUrl(url);
System.out.println(“fsfsf”+aobj);
JSONObject数组=aobj.getJSONObject(“警报列表”);
menuitemArr=array.getJSONArray(“数组”);
捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}       
返回menuitemArr;
}
@凌驾
受保护的void onPostExecute(JSONArray menuitemArr){
//TODO自动生成的方法存根
如果(menuitemArr.length()==0){
startActivity(新意图(“com.example.mysampleapp.ABOUT”);
//Toast.makeText(Alert.this,“无警报”,Toast.LENGTH_LONG.show();
}否则{
name=新字符串[menuitemArr.length()];
System.out.println(“名称”+名称);
alert=新字符串[menuitemArr.length()];
日期=新字符串[menuitemArr.lengt]