#android #android-asynctask #progressdialog
#Android #android-asynctask #progressdialog
Вопрос:
У меня есть две асинхронные задачи. В первом я извлекаю данные с сервера в форме JSON и преобразую их в строку. Во втором я разбираю строку на объекты.
Все это происходит после того, как пользователь нажимает на кнопку в AlertDialog. Пока это происходит, я хочу показать ProgressDialog. Но в настоящее время AlertDialog отключается после нажатия кнопки, что нормально. но диалоговое окно прогресса не отображается.
Вот мой код:-
private void PostString(String postedString)
{
// TODO Auto-generated method stub
String postUrl = EndPoints.PostURL;
try
{
String Response = new Post().execute(postUrl).get();
String getRequesturl= url
String items = new FetchItems().execute(getRequesturl).get();
ArrayList<HashMap<String, String>> updatedPostList = new GetList().execute(items).get();
}
private class Post extends AsyncTask<String, String, String>
{
@Override
protected String doInBackground(String... params)
{
// TODO Auto-generated method stub
HttpResponse response =null;
String resultString = "";
String myResponseBody = "" ;
// Creating HTTP client
HttpClient httpClient = new DefaultHttpClient();
// Creating HTTP Post
HttpPost request = new HttpPost(params[0]);
List<NameValuePair> nameValuePair =nameValuePairs
try
{
request.setEntity(new UrlEncodedFormEntity(nameValuePair));
response = httpClient.execute(request);
if(response.getStatusLine().getStatusCode()== 200)
{
HttpEntity entity = response.getEntity();
if (entity != null)
{
InputStream inputStream = entity.getContent();
myResponseBody = convertToString(inputStream);
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
return myResponseBody;
}
private class FetchItems extends AsyncTask<String, String, String>
{
// TODO Auto-generated method stub
@Override
protected String doInBackground(String... params)
{
// TODO Auto-generated method stub
HttpResponse response =null;
String resultString = "";
String myResponseBody = "" ;
// Creating HTTP client
HttpClient httpClient = new DefaultHttpClient();
// Creating HTTP Post
HttpGet request = new HttpGet(params[0]);
try
{
response = httpClient.execute(request);
if(response.getStatusLine().getStatusCode()== 200)
{
HttpEntity entity = response.getEntity();
if (entity != null)
{
InputStream inputStream = entity.getContent();
myResponseBody = convertToString(inputStream);
}
}
}
catch(Exception e)
{
}
return myResponseBody;
}
@Override
protected void onPostExecute(String result)
{
// TODO Auto-generated method stub
super.onPostExecute(result);
if(pd!=null amp;amp; pd.isShowing())
pd.dismiss();
}
@Override
protected void onPreExecute()
{
// TODO Auto-generated method stub
super.onPreExecute();
}
private class GetList extends AsyncTask<String, String, ArrayList<HashMap<String, String>>>
{
@Override
protected ArrayList<HashMap<String, String>> doInBackground(String... params)
{
// TODO Auto-generated method stub
myCList.clear();
try {
JSONObject jsonResponse = new JSONObject(new String(params[0]));
JSONArray mtUsers = jsonResponse.getJSONArray("ListOfC");
for (int i = 0; i < mtUsers.length(); i )
{
JSONObject menuObject = mtUsers.getJSONObject(i);
//Parsing
map = new HashMap<String,String>();
map.put(My items here)
myCommentsList.add(map);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Collections.reverse(myList);
return myList;
}
}
case R.id.btnAdd:
scrollNews.fullScroll(v.FOCUS_DOWN);
btnAddComms.setPressed(true);
builder = new AlertDialog.Builder(NewsDetails.this);
builder.setTitle("Post Comment");
builder.setIcon(R.drawable.post_comment_button);
final EditText input1 = new EditText(NewsDetails.this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
input1.setLayoutParams(lp);
builder.setView(input1);
builder.setPositiveButton("Post", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
pd = new ProgressDialog(Details.this);
pd.setMessage("Posting..");
pd.show();
pd.setCancelable(true);
postedString= input1.getText().toString();
dialog.dismiss();
if(postedString.length()>0)
{
Post(postedString);
}
else
{
Toast.makeText(Details.this, "Please enter a text.", Toast.LENGTH_LONG).show();
input1.findFocus();
}
}
Ответ №1:
Создайте a ProgressDialog
в качестве переменной экземпляра.
pDialog = new ProgressDialog(this);
pDialog.setMessage("Fetching data");
внутри метода onPreExecute() AsyncTask :
pDialog.show();
внутри метода onPostExecute() AsnycTask :
pDialog.dismiss();
Примечание 1: вам не нужно несколько асинхронных задач, вы можете выполнить всю выборку и синтаксический анализ только внутри первой асинхронной задачи, поскольку вы вызываете одну асинхронную задачу за другой.
String Response = new Post().execute(postUrl).get();
String getRequesturl= url;
String items = new FetchItems().execute(getRequesturl).get();
ArrayList<HashMap<String, String>> updatedPostList = new GetList().execute(items).get();
Примечание 2: когда вы выполняете AsyncTask.execute.get() в потоке пользовательского интерфейса, ваш пользовательский интерфейс будет заблокирован, что не рекомендуется. Итак, просто вызовите AsyncTask.execute() и покажите диалоговое окно прогресса, пока все происходит в фоновом режиме.
Комментарии:
1. Я выполняю execute.get(), чтобы получить строку и список. как я могу сделать это из самой задачи?
2. и ваш пользовательский интерфейс перестает отвечать на запросы, пока вы ждете результата?
3. кроме того, я думаю, вы можете захотеть показать диалоговое окно выполнения во время выполнения всех ваших асинхронных задач, поэтому просто поместите часть pDialog.dismiss() в ваш последний метод AsyncTask onPostExecute() .