最近我正在为一个网站开发一个Android应用程序。对于应用程序,我必须从服务器获取数据。目前我正在使用AsyncTasc .... doInBackground
,以便在下载时显示背景和数据。
但我有两个问题:
1.每当我更改设备的方向时,doInBackground
重新开始,应用程序崩溃。 (我已将Activity
的方向放入Portrait Mode
,但这不是我想要的解决方案。
你能帮助我,如何改进这个解决方案,甚至改用其他解决方案。
如果需要:我使用了以下代码:
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;
}
}
答案 0 :(得分:0)
这是活动的标准行为,你应该离开它。你可以做些什么来避免双重下载是将下载的结果缓存到某个地方,例如在Singleton类中。所以下次运行AsyncTask时,它会检查是否已有“缓存”数据,如果是,它会立即返回,否则它会执行下载。
通常我们将这个逻辑委托给另一个类,它就像一个不受Activity生命周期影响的Singleton。所以它不会受到影响。
我的想法是让AsyncTask调用单例上的方法,如:singleton.loadData()然后它会在内部执行这个检查是否已经缓存数据或是否需要下载的逻辑。