我尝试使用asynctask加载listview数据。当第一个活动调用启动新活动时,它应该加载新活动并显示数据。但我的第二项活动没有开始。
我的第二堂课是
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.search_data);
search_data=getIntent().getExtras().getString("Search_Value");
list = (ListView) findViewById(R.id.listView1);
accessWebService();
}
class SearchData extends AsyncTask<String, String, String>{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("rest_name", search_data));
Log.d("request!", "starting");
JSONObject json = jsonParser.makeHttpRequest(Search, "POST", params);
Log.d("Search", json.toString());
JSONArray jsonMainNode = json.optJSONArray("Search");
for (int i = 0; i < jsonMainNode.length(); i++) {
JSONObject jsonChildNode;
try {
jsonChildNode = jsonMainNode.getJSONObject(i);
String restName = jsonChildNode.optString("name");
//Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG).show();
String address = jsonChildNode.optString("address");
String mobile = jsonChildNode.optString("mobile");
String direction = "Direction: "+jsonChildNode.optString("direction");
String bestTime = "Best time to visite: "+jsonChildNode.optString("bestTime");
String food = jsonChildNode.optString("food");
String dress = jsonChildNode.optString("dress");
String priceRange = "Price Range: "+jsonChildNode.optString("priceRange");
Log.d("Dress", dress);
listData = new ArrayList<String>();
listData.add(restName);
listData.add(address);
listData.add(mobile);
listData.add(direction);
listData.add(bestTime);
listData.add(food);
listData.add(dress);
listData.add(priceRange);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MyListAdapter adapter = new MyListAdapter(Search.this,listData);
list.setAdapter(adapter);
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
public void accessWebService() {
SearchData data = new SearchData();
// passes values for the urls string array
data.execute();
}
当我运行它时,发生了以下错误。
01-16 15:19:48.092: E/AndroidRuntime(10724): FATAL EXCEPTION: AsyncTask #1
01-16 15:19:48.092: E/AndroidRuntime(10724): java.lang.RuntimeException: An error occured while executing doInBackground()
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.lang.Thread.run(Thread.java:856)
01-16 15:19:48.092: E/AndroidRuntime(10724): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5073)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:2809)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.View.setFlags(View.java:8414)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.view.View.setFocusableInTouchMode(View.java:5693)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.widget.AdapterView.checkFocus(AdapterView.java:720)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.widget.ListView.setAdapter(ListView.java:467)
01-16 15:19:48.092: E/AndroidRuntime(10724): at com.example.rp.Search$SearchData.doInBackground(Search.java:102)
01-16 15:19:48.092: E/AndroidRuntime(10724): at com.example.rp.Search$SearchData.doInBackground(Search.java:1)
01-16 15:19:48.092: E/AndroidRuntime(10724): at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-16 15:19:48.092: E/AndroidRuntime(10724): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-16 15:19:48.092: E/AndroidRuntime(10724): ... 5 more
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
将这些行移至onPostExecute
,因为doInBackGround
将在非UI线程中运行
MyListAdapter adapter = new MyListAdapter(Search.this,listData);
list.setAdapter(adapter);
答案 1 :(得分:1)
将其移至 onPostExecute()
MyListAdapter adapter = new MyListAdapter(Search.this,listData);
list.setAdapter(adapter);
这是因为您无法在 doInbackGround 方法中更新您的用户界面。
要更新您的UI,您必须使用onPostExecute方法更新它。
在doInbackGround中,您可以执行网络UI工作。
答案 2 :(得分:0)
似乎MyListAdapter存在问题
MyListAdapter adapter = new MyListAdapter(Search.this,listData);
list.setAdapter(adapter);
您需要从onPostExecute调用runOnUiThread()。
runOnUiThread(new Runnable() {
@Override
public void run() {
MyListAdapter adapter = new MyListAdapter(Search.this,listData);
list.setAdapter(adapter);
}
});