Android 执行doInBackground()时发生java.lang.RuntimeException错误
我是android开发的初学者,在下面的代码中遇到了错误。我正在为http请求调用asyn方法。它给我java.lang.RuntimeException错误,在执行doInBackground()时发生 json请求类: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
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"));
或
在这里,您试图从后台线程方式从AsyncTaskdoInBackground
访问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
在这里,您试图从后台线程方式从AsyncTaskdoInBackground
访问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]