2016-06-18 5 views
-1

Я делаю приложение, которое получает весь код html с сайта, тогда данные извлекаются в соответствии с моими требованиями. Мне нужен диалог прогресса, когда он работает в фоновом режиме, чтобы получить данные и после отображения данных в окне просмотра списка должно быть отклонено. Я искал много вопросов и руководств по Google. Проблема в том, что я не могу использовать функцию get здесь из-за этого мой диалог не отображается. Поэтому после этого я искал google другой метод, который говорит, что я должен использовать методы обратного вызова. Но я хочу данные из метода doInBackground. Как я могу получить данные, если я не буду использовать метод get.AsyncTask get function not show Progressbar

Вот мой код:

public class MainActivity extends AppCompatActivity { 

ListView listView; 
ArrayList<String> myArray; 
ArrayList<Integer> myImageArray; 
ProgressDialog progress; 
String getData; 

public class DownloadTask extends AsyncTask<String,Void,String>{ 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    progress.setMessage("Downloading Music :) "); 
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    progress.setIndeterminate(true); 
    progress.show(); 
    } 

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

    } 

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

     try{ 

      String result= ""; 

      URL url = new URL(params[0]); 

      HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); 

      InputStream inputStream = urlConnection.getInputStream(); 

      InputStreamReader reader = new InputStreamReader(inputStream); 

      int data = reader.read(); 

      while (data!=-1){ 

       char current = (char)data; 

       result += current; 

       data = reader.read(); 
      } 

      getData = result; 

      return result; 

     }catch (Exception e){ 

      e.printStackTrace(); 

      return "Failed!"; 

     } 


    } 

} 


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

    String total= ""; 
    String newTotal = ""; 

    listView = (ListView)findViewById(R.id.listView); 
    myArray = new ArrayList<String>(); 
    myImageArray = new ArrayList<Integer>(); 

    progress = new ProgressDialog(this); 

    DownloadTask task = new DownloadTask(); 

    try { 

     String text = task.execute("https://www.earticleblog.com/").get(); 

     Pattern p = Pattern.compile("<div class=\"td-module-thumb\">(.*?)</div>"); 

     Matcher m = p.matcher(text); 

     while(m.find()){ 


      total += m.group(1); 


     } 

     p = Pattern.compile("a href=\"(.*?)\">"); 

     m = p.matcher(total); 

     while (m.find()){ 

      newTotal += m.group(1); 

     } 

     p = Pattern.compile("title=\"(.*?)http"); 

     m = p.matcher(newTotal); 

     while (m.find()){ 

      myArray.add(m.group(1)); 
      myImageArray.add(R.drawable.tryit); 

     } 

    } catch (InterruptedException e) { 

     e.printStackTrace(); 

    } catch (ExecutionException e) { 

     e.printStackTrace(); 

    } 


    ArrayAdapter adapter = new CustomAdapter(this,myImageArray,myArray); 
    listView.setAdapter(adapter); 


} 

} 
+0

Применить решение, а затем проверить – Vickyexpert

+0

Вы получили решение или нет? – Vickyexpert

ответ

0

Как уже упоминалось, вы должны показать ProgressDialog в onPreExecute методе, и спрятаться в onPostExecute(). Кроме того, с progress = new ProgressDialog(this); вы только создаете диалог, не показывая. Попробуйте ProgressDialog.show(...) (https://developer.android.com/reference/android/app/ProgressDialog.html).

И еще один совет - не делайте так много в onCreate (особенно не делайте никаких циклов) - ваше приложение будет отображаться с задержкой.

+0

См. Мой обновленный код, который все еще не работает. –

+0

Не используйте AsyncTask таким образом. Используйте только execute (params) и все после task.execute() перейдите в onPostExecute(). Теперь вы пытаетесь загружать данные в основной поток, а затем использовать его немедленно. Просто вызовите execute в AsyncTask, а затем onCreate нужно завершить. Когда AsyncTask закончит, он будет вызывать onPostExecute и использовать ваш результат там. –

+0

На самом деле я думал об этом. Я собираюсь попробовать это и дам вам знать –

0

вы должны начать прогресс бар в onPreExecute(); метод, и вы должны закрыть его в onPostExecute(); метод

+0

Но когда я делаю этот диалог прогресса, пока не отображается –

+0

см. На этом сайте: http://www.journaldev.com/9708/android-asynctask-example-tutorial –

+0

Обновлен мой код, который пока не отображается –

0

Вам нужно сделать этот путь для отображения progressdailog.

в onPreExecute() вы должны инициализировать прогресс как этот

progres = new ProgressDialog(MainActivity.this); 
progres.setMessage("Please Wait"); 
progres.show(); 

и onPostExecute(); Вы должны уволить прогресс

if(progres.isShowing()){ 
progres.dismiss(); 
} 

в классе просто скопировать и заменить этот

public class DownloadTask extends AsyncTask<String,Void,String>{ 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progres = new ProgressDialog(MainActivity.this); 
     progres.setMessage("Please Wait"); 
     progres.show(); 

    } 

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

      if(progres.isShowing()){ 
       progres.dismiss(); 
      } 

    } 

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

     try{ 

      String result= ""; 

      URL url = new URL(params[0]); 

      HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); 

      InputStream inputStream = urlConnection.getInputStream(); 

      InputStreamReader reader = new InputStreamReader(inputStream); 

      int data = reader.read(); 

      while (data!=-1){ 

       char current = (char)data; 

       result += current; 

       data = reader.read(); 
      } 

      getData = result; 

      return result; 

     }catch (Exception e){ 

      e.printStackTrace(); 

      return "Failed!"; 

     } 


    } 

} 

Позвоните своему асинхронной задача

task.execute(); 

или

new Downloadtask().execute(); 

попробовать этот путь ,

+0

Но когда я делаю этот прогресс диалоговое окно все еще не отображается –

+0

в вашем классе async вы можете видеть, что нет инициализации, и, пожалуйста, посмотрите мои обновления answer @AnshumanKaushik – RushDroid

+0

Я обновил свой код до сих пор не отображается –

0

изменить ваши ниже двух методов,

@Override 
    protected void onPostExecute(String result) { 
     // execution of result of Long time consuming operation 
     progressDialog.dismiss(); 

    } 


    @Override 
    protected void onPreExecute() { 
     progressDialog = ProgressDialog.show(MainActivity.this, 
       "", "Please Wait"); 
    } 
+0

Но когда я делаю этот диалог прогресса, пока не отображается –

+0

обновите свой код выше, чтобы я мог проверить, что вы обновили. – Vickyexpert

+0

Код обновлен, но все еще не работает –