每当我改变屏幕的方向时,AsyncTask ... doInBackground都会重复

时间:2014-08-18 09:13:59

标签: android asynchronous

最近我正在为一个网站开发一个Android应用程序。对于应用程序,我必须从服务器获取数据。目前我正在使用AsyncTasc .... doInBackground,以便在下载时显示背景和数据。

但我有两个问题: 1.每当我更改设备的方向时,doInBackground重新开始,应用程序崩溃。 (我已将Activity的方向放入Portrait Mode,但这不是我想要的解决方案。

  1. 在显示数据之前,需要全部下载数据。
  2. 你能帮助我,如何改进这个解决方案,甚至改用其他解决方案。

    如果需要:我使用了以下代码:

    private class GetNewsData extends
            AsyncTask<String, Void, ArrayList<DashBoardModel>> {
    
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected ArrayList<DashBoardModel> doInBackground(String... URL) {
    
            String categories_url = URL[0]; // Creating JSON Parser instance
            JSONNumberParser jParser = new JSONNumberParser(); // getting JSON
                                                                // string from
            // URL
            JSONArray newsItems = jParser.getJSONFromUrl(categories_url);
            Log.e("lsbsfbsfdbsfd", newsItems.toString());
            try {
                for (int i = 0; i < newsItems.length(); i++) {
    
                    JSONObject c = newsItems.getJSONObject(i);
    
                    .....more code over here....
    
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            .... more code over here...
            return items;
        }
    
        @Override
        protected void onPostExecute(ArrayList<DashBoardModel> items) {
            customModelAdapter.notifyDataSetChanged();
        }
    }
    

    以下是我经常使用的JSonParser.class

    public class JSONParser {
    
        static InputStream is = null;
        static JSONObject jObj = null;
        JSONArray jArr = null;
        static String json = "";
    
        // constructor
        public JSONParser() {
    
        }
    
        public JSONArray getJSONFromUrl(String url) {
    
            Log.e("JSON Parser", "U futem tek Jason " );
    
            // Making HTTP request
            try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
    
    
                HttpResponse httpResponse = httpClient.execute(httpPost);
    
                HttpEntity httpEntity = httpResponse.getEntity();
    
                is = httpEntity.getContent();           
                Log.e("JSON Parser", "vajti " );
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is,  "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                json = sb.toString();
                Log.e("JSON Parser", json );
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }
    
            // try parse the string to a JSON object
            try {
                JSONTokener jt = new JSONTokener(json);
                Object rootElement = jt.nextValue();
                if (rootElement instanceof JSONObject) {
                   // You got an object from the jresponse
                    jObj = new JSONObject(json);
                } else if (rootElement instanceof JSONArray) {
                     jArr = new JSONArray(json);
                     Log.e("JSON Parser", "erdhi" );
                     return jArr;
                   // You got a JSON array
                }
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }
    
            // return JSON String
            return jArr;
    
        }
    }
    

1 个答案:

答案 0 :(得分:0)

这是活动的标准行为,你应该离开它。你可以做些什么来避免双重下载是将下载的结果缓存到某个地方,例如在Singleton类中。所以下次运行AsyncTask时,它会检查是否已有“缓存”数据,如果是,它会立即返回,否则它会执行下载。

通常我们将这个逻辑委托给另一个类,它就像一个不受Activity生命周期影响的Singleton。所以它不会受到影响。

我的想法是让AsyncTask调用单例上的方法,如:singleton.loadData()然后它会在内部执行这个检查是否已经缓存数据或是否需要下载的逻辑。