#android #android-asynctask #android-progressbar #android-json #android-parser
#Android #android-asynctask #android-progressbar #android-json #android-парсер
Вопрос:
Анализатор JSON, использующий asynctask с индикатором выполнения. Как правильно это сделать?
Я применил и адаптировал то, что я прочитал из tuts, но он возвращает null при возврате данных из downloadTask
Вот моя задача загрузки:
private class DownloadTask extends AsyncTask<Void, Integer, Void> {
private ProgressDialog dialog;
@Override
protected void onProgressUpdate(Integer... values) {
dialog.setProgress(values[0]);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
this.dialog = new ProgressDialog(ma);
this.dialog.setIndeterminate(false);
this.dialog.setMax(100);
this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
this.dialog.setCancelable(false);
this.dialog.setTitle(R.string.updating);
this.dialog.setMessage(getString(R.string.downloading));
this.dialog.show();
// progress = 0;
}
@Override
protected String doInBackground(String... arg0) {
int count;
byte data[] = null;
url = "http://arsonicdemo.digify.com.ph/webapi/campaigns?pf=1";
try {
URL url1 = new URL(url);
URLConnection conexion = url1.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
InputStream input = new BufferedInputStream(url1.openStream());
campaignObj = new JSONObject(parser(url));
populateCampaigns(campaignObj);
appClass.updateList();
data = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total = count;
publishProgress((int) (total * 100 / lenghtOfFile));
}
input.close();
} catch (Exception e) {
}
return new String(data);
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dialog.dismiss();
Toast.makeText(ma, "Update Successful", Toast.LENGTH_SHORT).show();
ma.initMarkers();
}
}
По сути, это метод populateCampaigns:
public void populateCampaigns(String url) throws JSONException {
campaignObj = new JSONObject(parser(url));
campaignData = campaignObj.getJSONObject("data");
}
И, наконец, вот метод синтаксического анализа:
public static String parser(String url) {
StringBuilder builder = new StringBuilder();
System.setProperty("http.keepAlive", "false");
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
final HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000);
client = new DefaultHttpClient(httpParams);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
Log.e("CAMPAIGN DOWNLOADER ERROR", "Failed to download file");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return builder.toString();
}
Комментарии:
1.
And lastly, here is parser method:
Почему вы называете этот анализатор метода? Ничего не анализируется. Этот метод загружает некоторый текст. Возможно, текст в формате json. Но синтаксический анализ… Нет. Теперь, что / где находится нулевой указатель?
Ответ №1:
Вы пытаетесь загрузить с URL-адреса дважды. Сначала вы начинаете использовать UrlConnection
для запуска загрузки, а затем вызываете свой parser
метод, который не выполняет синтаксический анализ, но который также используется HttpClient
для загрузки с этого URL. Довольно все перепутал.
Ответ №2:
Я, наконец, понял это, вот весь мой код AsyncTask, любые комментарии или предложения приветствуются:
private class DownloadTask extends AsyncTask<Void, Integer, Void> {
private ProgressDialog dialog;
@Override
protected void onProgressUpdate(Integer... progress) {
int current = progress[0];
int total = progress[1];
float percentage = 100 * (float) current / (float) total;
dialog.setProgress((int) percentage);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
this.dialog = new ProgressDialog(ma);
this.dialog.setIndeterminate(false);
this.dialog.setMax(100);
this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
this.dialog.setCancelable(false);
this.dialog.setTitle(R.string.updating);
this.dialog.setMessage(getString(R.string.downloading));
this.dialog.show();
// progress = 0;
}
@Override
protected Void doInBackground(Void... arg0) {
try {
timestampPref = appClass.getSharedStringPref("updateTimestamp", null);
if (null != timestampPref) {
url = getResources().getString(R.string.updateUrl1) timestampPref getResources().getString(R.string.updateUrl2);
Log.i("URL", url);
} else {
url = getResources().getString(R.string.firstUrl);
Log.i("URL", url);
}
downloadCampaigns: {
try {
System.setProperty("http.keepAlive", "false");
campaignObj = new JSONObject(parser(url));
try {
campaignData = campaignObj.getJSONObject("data");
dataLength = campaignData.length();
for (int x = 0; x < dataLength; x ) {
if (reachable()) {
campaignCtr = campaignData.getJSONObject(String.valueOf(x));
tempType = campaignCtr.getString("template_type");
populateCampaigns(campaignCtr, tempType);
publishProgress(x, dataLength);
} else {
// AlertDialog.Builder builder = new
// AlertDialog.Builder(ma);
// builder.setTitle("NO INTERNET");
// builder.setMessage("Please turn on wifi or cellular data in your mobile Settings to continue.");
// builder.setPositiveButton("Okay", null);
// builder.show();
break downloadCampaigns;
}
}
} catch (Exception e) {
e.printStackTrace();
}
updateTimestamp = campaignObj.getString("date");
updateTimestamp = updateTimestamp.substring(0, updateTimestamp.indexOf(" "));
appClass.setSharedStringPref("updateTimestamp", updateTimestamp);
Log.i("UPDATETIMESTAMP", updateTimestamp);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
Log.e("UPDATE ERROR", e.toString());
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
appClass.updateList();
dialog.dismiss();
Toast.makeText(ma, "Update Successful", Toast.LENGTH_SHORT).show();
ma.initMarkers();
}
}