在Android上使用AQuery

时间:2015-05-28 08:27:14

标签: android android-asynctask aquery

我需要在我的Android项目中使用AQuery,以便对服务器进行异步调用。我只想打电话给服务器,当它给我数据时,我会用这些数据更新我的视图。 所以,我在AsyncTask中编写了异步调用。下面你可以看到我做了什么:

public class Tab1Fragment extends Fragment implements OnItemClickListener {

    private ListView categorieListView ; 

    private ArrayAdapter<String> listAdapterCategorie ;
    private AQuery aq;
    private String[] lista = null;
    private ProgressDialog pDialog;
    private String nome_categoria;
    private int[] arrayID = null;

    ArrayList<String> planetList;
    JsonRequestActivity categoryAjax;

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

        pDialog = new ProgressDialog(getActivity());
        LinearLayout view = (LinearLayout) inflater.inflate(R.layout.tab1, container, false);
        aq = new AQuery(this.getActivity(), view);                       
        categorieListView = (ListView) view.findViewById(R.id.listView1);        
        //new FetchMyDataTask(this.getActivity(), new FetchMyDataTaskCompleteListener(listAdapterCategorie, categorieListView, this.getActivity()), aq).execute("InputString");

        if(lista == null){
            new AggiornaLista().execute();
        }else{
            listAdapterCategorie = new ArrayAdapter<String>(getActivity().getApplicationContext(), R.layout.categoriegenerali, R.id.nomeAttivita, lista);
            categorieListView.setAdapter( listAdapterCategorie );
        }

        categorieListView.setOnItemClickListener(this);
        return view;
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        Intent esercizioScelto = new Intent(this.getActivity(), CategoriaScelta.class);
        nome_categoria = categorieListView.getItemAtPosition(position).toString();
        esercizioScelto.putExtra("nome_categoria", nome_categoria);
        esercizioScelto.putExtra("id_categoria", arrayID[position]);
        startActivity(esercizioScelto);   
    }             

    private class AggiornaLista extends AsyncTask<String, Void, String[]>{
        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            pDialog.setMessage("Caricamento dati server");                  
        }

        @Override
        protected String[] doInBackground(String... params) {
            String url = Const.URL_JSON_ARRAY;

            Map<String, String> params2 = new HashMap<String, String>();
            params2.put("type", "get_all");

            aq.ajax(url, params2, JSONArray.class, new AjaxCallback<JSONArray>() {                                                

                @Override
                public void callback(String url, JSONArray json, AjaxStatus status) {
                    if(json != null){
                        lista = new String[json.length()];
                        arrayID = new int[json.length()];
                        for(int i = 0; i < json.length(); i++){
                            try {
                                lista[i] = result.getJSONObject(i).getString("Name");
                                arrayID[i] = result.getJSONObject(i).getInt("ID");
                            } 
                            catch (JSONException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        //Toast.makeText(aq.getContext(), jsonArray.toString(), Toast.LENGTH_LONG).show();
                    }else{                              
                        //ajax error, show error code
                        //Toast.makeText(aq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG).show();
                    }
                    // do something with the result                             

                }
            });       
            return lista;
        }

        @Override
        protected void onPostExecute(String result[])
        {
            super.onPostExecute(result);
            pDialog.dismiss();
            listAdapterCategorie = new ArrayAdapter<String>(getActivity().getApplicationContext(), R.layout.categoriegenerali, R.id.nomeAttivita, result);

            // Set the ArrayAdapter as the ListView's adapter. 
            categorieListView.setAdapter( listAdapterCategorie );

        }

    }

}

这种实施方式并不像我预期的那样有效。实际上,在onPostExecute中,doInBackground返回的参数不会更新,它包含初始化值(null)。 然后我只在AsyncTask中改变了一些东西:

private class AggiornaLista extends AsyncTask<String, Void, Void>
    {
        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            pDialog.setMessage("Caricamento dati server");

        }

        @Override
        protected Void doInBackground(String... params) {
            String url = Const.URL_JSON_ARRAY;

            Map<String, String> params2 = new HashMap<String, String>();
            params2.put("type", "get_all");

            aq.ajax(url, params2, JSONArray.class, new AjaxCallback<JSONArray>() {                                                
                @Override
                public void callback(String url, JSONArray json, AjaxStatus status) {
                    if(json != null){
                        lista = new String[json.length()];
                        arrayID = new int[json.length()];
                        for(int i = 0; i < json.length(); i++){
                            try {
                                lista[i] = result.getJSONObject(i).getString("Name");
                                arrayID[i] = result.getJSONObject(i).getInt("ID");
                            } catch (JSONException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        //Toast.makeText(aq.getContext(), jsonArray.toString(), Toast.LENGTH_LONG).show();
                    }else{                              
                        //ajax error, show error code
                        //Toast.makeText(aq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG).show();
                    }
                    // do something with the result                             
                    listAdapterCategorie = new ArrayAdapter<String>(getActivity().getApplicationContext(), R.layout.categoriegenerali, R.id.nomeAttivita, lista);

                    // Set the ArrayAdapter as the ListView's adapter. 
                    categorieListView.setAdapter( listAdapterCategorie );
                }
            });       
            return null;
        }

        @Override
        protected void onPostExecute(Void result)
        {
            super.onPostExecute(result);
            pDialog.dismiss();
        }

    }

这样做,用户界面被正确更新,但我认为这不是正确的方法。 那么,我该怎么办? 感谢。

安德烈

2 个答案:

答案 0 :(得分:1)

如果我没弄错的话,你现在正在异步任务中包装一个异步任务。您的aq.ajax(...)正在启动一个新线程来进行调用,然后调用您定义的callback(...)AsyncTask执行doInBackground(),您可以在其中开始其他任务。在完成ajax调用之前,doInBackground()方法完成。所以onPostExecute()在ajax调用完成之前执行。

解决方案是省略整个AsyncTask结构。只需在主要aq.ajax()中拨打onCreateView,并在您定义的回叫中返回呼叫时执行必须执行的操作。 (基本上将doInBackGround()的内容放在主

答案 1 :(得分:0)

谢谢你的回复。根据您的建议,我创建了一个示例项目:基本上,它只有一个文本视图,显示服务器传递的字符串值。这是主要活动,是项目中唯一的活动:

# int = 1
i = 2
if type(i) == int:
    print 'Is int'
else:
    print 'Not int'

不幸的是,setText设置初始化值。 我怎么解决这个问题? 再次感谢你。

安德烈