2015-10-03 2 views
1

У меня возникли проблемы с отображением индикатора прогресса диалога. Я просмотрел несколько потоков, и предлагаемые решения, похоже, не работают.Диалоговое окно выполнения задачи Async не отображается

Весь код в этом AsyncTask действительно получил вызов, однако я не вижу отображаемого индикатора выполнения. Этот AsycTask определен в отдельном классе и вызывается из моего фрагмента, где я передаю getActivity() в качестве контекста.

Моя мысль заключается в том, что проблема связана с тем, как контекст передается в диалог прогресса.

public class ExampleClass 
{ 
    private class loginAsyncTest extends AsyncTask<HttpPackage, Void, String> 
    { 
     ProgressDialog dialog; 
     Context spinnerContext; 

     public void setSpinnerContext(Context context) 
     { 
      spinnerContext = context; 
     } 

     @Override 
     protected void onPreExecute() 
     { 
      dialog = new ProgressDialog(spinnerContext); 
      dialog.setMessage("Loading..."); 
      dialog.setIndeterminate(false); 
      dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      dialog.setCancelable(true); 
      dialog.show(); 
      Log.d("http", "dialog spinner started"); 
     } 

     protected String doInBackground(HttpPackage... httpParameters) 
     { 
      HttpClient client = new DefaultHttpClient(); 
      String url = httpParameters[0].getUrl(); 
      // Get HTTP parameters that are passed in 
      ArrayList<NameValuePair> parameterList = httpParameters[0].getParameters(); 
      HttpPost post = new HttpPost(url); 
      String responseJson = ""; 

      try 
      { 
       post.setEntity(new UrlEncodedFormEntity(parameterList)); 
       HttpResponse response = client.execute(post); 

       BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
       String line = ""; 
       while ((line = rd.readLine()) != null) 
       { 
        responseJson = responseJson + line; 
       } 

      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

      return responseJson; 
     } 

     protected void onPostExecute(String result) 
     { 
      if(dialog.isShowing()) 
      { 
       dialog.dismiss(); 
      } 
     } 
    } 
} 

Вот вызов ExampleClass, который поступает из фрагмента, который предоставляет контекст.

Public class SampelFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     final View rootView = inflater.inflate(R.layout.dialog_login, container, false);  

     ExampleClass.loginRequest(params, getActivity())); 

     return rootView; 
    } 
} 

ExampleClass затем передает контекст на наш AsyncTask

public String loginRequest(HttpPackage postParameters, Context context)  
{ 
    loginAsyncTest loginAsync = new loginAsyncTest(context); 
    loginAsync.execute(postParameters); 

    return someString; 
} 
+0

, где вы работаете? –

+0

@Lakhan Я вызываю задачу async из фрагмента. Мне бы хотелось, чтобы в диалоговом окне прогресса отображалось, но задача async находится в отдельном классе, где его можно повторно использовать. – mil06

ответ

0

Попробуйте использовать ExampleClass.this в качестве данного контекста и убедитесь, что вы вызываете метод setSpinnerContext().

Кроме того, я думаю, что было бы лучше, если бы вместо метода setSpinnerContext() вы добавляли конструктор для loginAsyncTask, который получает контекст. Поэтому я хотел бы заменить метод setSpinnerContext(Context context) с этим:

public loginAsyncTask(Context context){ 
    this.context = context; 
} 

и вы должны создать его экземпляр в качестве new loginAsyncTask(ExampleClass.this).execute();

+0

Спасибо, однако ExampleClass - это базовый класс утилиты, который из моего понимания не имеет контекста. – mil06

0

Я не вижу, что вы когда-либо называли publishProgress() или переопределить onProgressUpdate(). В моих приложениях я вызываю publishProgress() в свой метод doInBackground(), который, следовательно, обновляет индикатор выполнения. example в документах для Android очень проста, но очень полезна:

Возможно, вам также необходимо создать индикатор выполнения вне AsyncTask и передать его AsynchTask в качестве параметра в конструкторе или с помощью метода setter. Таким образом, вам не нужно задаваться вопросом, используется ли правильный контекст.

+0

Нет необходимости в этом, диалог прогресса будет отлично работать с тем, что делает OP. Кажется, есть некоторые незначительные проблемы, я думаю, решение joaquin исправит это. – varunkr

Смежные вопросы