2014-01-16 2 views
0

Я попытался загрузить данные списка с помощью asynctask. когда первый вызов активности начинает новую активность, он должен загружать новую активность и отображать данные. но моя вторая активность не началась.Ошибка запуска Asynctask

Мой второй класс

@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

Вы можете вставить строку ответа json –

+0

, которая является «строкой 102»? – R9J

ответ

2

переместить эти строки в onPostExecute потому, doInBackGround будет работать в Non-UI Thread

MyListAdapter adapter = new MyListAdapter(Search.this,listData); 
list.setAdapter(adapter); 
1

переместить это onPostExecute()

MyListAdapter adapter = new MyListAdapter(Search.this,listData); 
    list.setAdapter(adapter); 

Это потому, что вы не можете обновите свой пользовательский интерфейс в doInbackGround способ.

Для обновления пользовательского интерфейса вы должны обновить его в методе onPostExecute.

В doInbackGround вы можете выполнить свой сетевой интерфейс.

0

, кажется, есть проблема с MyListAdapter

MyListAdapter adapter = new MyListAdapter(Search.this,listData); 
list.setAdapter(adapter); 

Вы должны вызвать runOnUiThread() из onPostExecute.

 runOnUiThread(new Runnable() { 

      @Override 
       public void run() { 
        MyListAdapter adapter = new MyListAdapter(Search.this,listData); 
        list.setAdapter(adapter); 
       } 
      }); 
Смежные вопросы