2017-01-17 10 views
1

У меня есть класс, называемый RestClient, который получает некоторую информацию из моего webService, а затем возвращает, и я пытаюсь запустить диалог Progress, когда он обращается к Интернету. И поскольку я использую этот класс более чем в одном месте, я не буду делать в самой Деятельности. Вот мой RestClient класс:ProgressDialog в другом классе AsyncTask, не отображающемся при вызове из Activity

public class RestClient extends AsyncTask<URL, String, String> { 

    private Context context; 
    private String string; 
public RestClient(Context context, String string) 
{ 
    this.context = context; 
    this.string = string; 
} 

@Override 
protected void onPreExecute() { 
    dialog = ProgressDialog.show(context, "Buscando seu Produto","Por favor, espere um momento...",true ,false); 
    //I've already tried: 
    /*ProgressDialog dialog = new ProgressDialog(context); 
    dialog.setTitle("Buscando seu Produto"); 
    dialog.setMessage("Por favor, espere um momento..."); 
    dialog.setIndeterminate(true); 
    dialog.setCancelable(false);*/ 

    dialog.show(); 
    super.onPreExecute(); 
} 

@Override 
protected String doInBackground(URL... params) { 
    try { 

     //Some WebService gets and Json conversions using my string variable 
     //and some Thread.sleep that counts 2000 miliseconds to do all the queries 

     dialog.dismiss(); 

    } catch (IOException | InterruptedException |JSONException e) { 
     e.printStackTrace(); 

     dialog.dismiss(); 

     return e.getMessage(); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 


    } 
} 

И в моей деятельности я называю класс RestClient, когда я нажимаю кнопку, как это:

--- EDIT: Я забыл упомянуть, что у меня есть AlertDialog в этот же вид деятельности, который может быть показан иногда до и после ProgressDialog ---

private Button buttonConfirm; 
    private EditView evString; 

    private String theString; 
    private String returnFromExecute; 

    private RestClient restClient; 


    private AlertDialog.Builder dialog; 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_access_webservice); 

      evString = (EditText) findViewById(R.id.editViewMyString); 
      buttonConfirm = (Button) findViewById(R.id.buttonConfirm); 

      dialog = new ProgressDialog(IdentificacaoDeProdutoActivity.this); 
      dialog.setTitle("Error"); 
      dialog.setMessage("Please try again"); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(false); 


      buttonConfirmar.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) {     
        theString = evString.getText().toString(); 
        if(!(theString!=null && theString.trim().length()>0)) //To check if theString is not null 
        { 
          dialog.show(); 
        } 

        restClient = new RestClient(AccessWebserviceActivity.this, theString); 

        //Then I call execute and put a Thread.sleep a bit longer to compensate the ones I have in my doInBackground 
        restClient.execute(); 
        try { 
         Thread.sleep(2050); 

        } catch (Exception e) { 
         dialog.show(); 
         return; 
        } 
       } 
      } 
     } 

проблема заключается в том, что мой ProgressDialog никогда не показывает. Я уже пробовал getParent(), getApplication() и getApplicationContext() вместо AccessWebserviceActivity.this, но никто не работал. Кто-нибудь имеет представление о том, что происходит, и что мне делать?

+0

Вы можете сказать, что ваш класс AsyncTask является дочерним по вашему классу активности или AsnctaskClass имеет другой пакет? – Hamza

+0

@AmeerHamza, это не ребенок моей деятельности, потому что я использую его в других действиях, но да, это не в том же пакете, который у меня есть. – Cocholate

ответ

1

После долгих исследований о Нити и процесса я узнал, что я должен был инкапсулировать весь код, который я после моего RestClient.execute в

new Thread(new Runnable() { public void run() { // My code } });

так, что выполнение кода произошло в фоновом режиме, а также в запросе WebService.

EDIT:

Даже если создавая новые работы темы, не рекомендуется! Правильное дело было бы создать еще один класс, который расширяет AsyncTask, чтобы выполнить работу.

1

Вы не создали диалог прогресса, попробуйте это.

ProgressDialog dialog; 

@Override 
    protected void onPreExecute() { 
     dialog= new ProgressDialog(context); 
     dialog.setMessage("on Progress"); 
     dialog.show(); 
     super.onPreExecute(); 
    } 
+0

Не отрицайте мой вопрос, пожалуйста. Разве это не так просто. Этот индикатор прогресса не появляется ни на что. – Cocholate

+0

Я не делаю ничего плохого брата. Я удивлен, почему мой ответ не работает для вас. –

+0

Все нормально. Я пробовал все, что сказал каждый блог и каждое решение, но оно не сработало. – Cocholate

0

Вам нужно позвонить

dialog = ProgressDialog.show(context, "Buscando seu Produto","Por favor, espere um momento...",true ,false); 

и удалить

dialog.show(); 

Также поместите ваш dialog.dismiss(); метод в onPostExecute(). Этот метод dialog.dismiss() хорош в блоке catch, но какова его цель, если вы вызываете этот метод в блоке try. Он удалит диалоговое окно прогресса, как только вы назовете это AsyncTask.

+0

Удалены ли методы удаления из блока try в методе doInBackground? Если вы получаете какую-либо ошибку, вставьте ее, чтобы кто-то мог вам помочь. – Raheel

+0

Да, у меня есть. Я просто положил его туда, потому что где-то сказал, что это может быть одной из проблем, но не сработало, – Cocholate

+0

Я получаю «I/Хореограф: пропустил 126 кадров! Приложение может делать слишком много работы над своей основной нитью. « – Cocholate

0
returnFromExecute = restClient.get(); 

Удалите это заявление. Вы уже:

restClient.execute(); 

Это должно быть сделано.

В результате doInBackground() вы должны обращаться в onPostExecute(). Он не может быть обработан или получен в onCreate().