用于JSON解析和UI更新的Asynctask设置

时间:2013-05-24 13:44:41

标签: android json android-asynctask

有人可以帮我优化这个AsyncTask代码。我是JSON解析android并根据输入“TAG_TYPE”用不同的数据更新多个列表视图..这里是我正在调用的公共类

 public class Onlinetip extends AsyncTask<String, Integer, ArrayList<String>> {
 ArrayList<NameValuePair> nameValuePairs;
 // TAG_TYPE;
 HttpPost httppost;
 HttpClient httpclient;
 HttpResponse response;
 HttpEntity entity;
 private static final String TAG_CONTENT = "tip_content";
protected ArrayList<String> doInBackground(String... params) 
{    ArrayList<NameValuePair> nameValuePairs;
    String TAG_TYPE = params[0];
    DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("API LOCATION");
        ArrayList<String> listItems = new ArrayList<String>();          
     try {
        nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("tip",TAG_TYPE));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        response=httpclient.execute(httppost);
        if (response.getStatusLine().getStatusCode() == 200)
        {
            entity =response.getEntity();
            if(entity !=null)
            {
                InputStream instream = entity.getContent();
                JSONArray jsonResponse = new JSONArray(convertStreamToString(instream));
                for(int i = 0; i < jsonResponse.length(); i++)
                                {   
                                    JSONObject c = jsonResponse.getJSONObject(i);
                                    String list = c.getString(TAG_CONTENT);
                                    listItems.add("•  "+list);
                                }
                    }
            }
        else{
            String error="No Internet connection!";
            listItems.add(error);
        }
     }   
     catch (JSONException e) 
     {
        String error="No Internet connection!";
        listItems.add(error);
         e.printStackTrace();
     } catch (UnsupportedEncodingException e) {
         String error="No Internet connection!";
        listItems.add(error);
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        String error="No Internet connection!";
        listItems.add(error);
        e.printStackTrace();
    } catch (IOException e) {
        String error="No Internet connection!";
        listItems.add(error);
        e.printStackTrace();
    }

    return listItems;
}
     private static String convertStreamToString(InputStream is) {
            /*
             * To convert the InputStream to String we use the BufferedReader.readLine()
             * method. We iterate until the BufferedReader return null which means
             * there's no more data to read. Each line will appended to a StringBuilder
             * and returned as String.
             */
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return sb.toString();
        }

这是对此课程的示例调用。

public class SocialTips extends SherlockListFragment {
Onlinetip oltip=new Onlinetip();
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_list_item_1,oltip.doInBackground("social"));
    setListAdapter(adapter);
    return super.onCreateView(inflater, container, savedInstanceState); 
     }

我的asynctask设置正确吗?我在Logcat中得到了frameskips ..最终是一个ANR。   在onPostExecution中进行更改后,我收到以下错误

05-25 01:13:37.640: E/AndroidRuntime(698): FATAL EXCEPTION: main
05-25 01:13:37.640: E/AndroidRuntime(698): java.lang.IllegalStateException: Content view not yet created
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
05-25 01:13:37.640: E/AndroidRuntime(698):  at com.agrim.lifetips.GamesSports.onCreateView(GamesSports.java:38)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1064)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.view.ViewPager.populate(ViewPager.java:911)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.view.View.measure(View.java:15172)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.view.View.measure(View.java:15172)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
05-25 01:13:37.640: E/AndroidRuntime(698):  at android.view.View.measure(View.java:15172)

2 个答案:

答案 0 :(得分:1)

我认为您需要在execute上致电Onlinetip以在后台线程上启动任务。

SocialTips课程中,您在主要主题上致电doInBackground

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_list_item_1,oltip.doInBackground("social"));

Android documentation,请参阅标题'使用':

  

创建后,任务执行非常简单:

     

new DownloadFilesTask()。execute(url1,url2,url3);

答案 1 :(得分:0)

doInBackground执行完成时,您需要使用onPostExecute来更新ListView。为此,您需要使用Onlinetip类构造函数将ListView和当前活动的上下文从SocialTips发送到Onlinetip类:

这样做:

首先在Onlinetip类中创建一个参数化构造函数:

ListView listview;
Context context;
public Onlinetip(ListView listview,Context context){
  this.listview=listview;
  this.context=context;
}
...

protected void onPostExecute(ArrayList<String> result) {
         //update ListView Adapter here
       ArrayAdapter<String> adapter =context,android.R.layout.simple_list_item_1); 
       listview.setListAdapter(adapter);
     }

现在将ListView和Context发送到Onlinetip类:

  public View onCreateView(LayoutInflater inflater, 
                    ViewGroup container, Bundle savedInstanceState){

    ListView listview= this.getListView();
    Onlinetip oltip=new Onlinetip(getActivity(),listview);
    // start AsyncTask here
    oltip.execute("social");

    return super.onCreateView(inflater, 
           container, savedInstanceState); 
  }