2013-11-18 2 views
0

Я хочу показать диалог выполнения в макете страницы. Я реализовал в следующем коде. Диалог выполнения не закрыт и продолжает работать. Когда я нажимаю изображение на предыдущей странице, он перейдет к следующему макету, и я хочу, чтобы в этом макете был показан диалог выполнения, прежде чем все данные будут загружены с сервера и отобразится в списке текущий макет. Отобразится диалоговое окно прогресса, и список отображается в фоновом режиме, но диалог выполнения продолжает работать, и он не закрывается. Я не знаю, где я ошибаюсь. Помоги пожалуйста.Диалог прогресса Android не закрывается

ProgressDialog pg; 
String[] ar; 
public void onCreate(Bundle savedInstanceState) 
{ 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.filename); 
     pg=ProgressDialog.show(this, "ABC", "Downloading .....",true); 

     Thread dt= new Thread(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        String addr=Util.url; 
        URL url = new URL(urlname); 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
        urlConnection.setConnectTimeout(5000);    
        InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
        BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
        String x = ""; 
        String total = ""; 
        int i=0; 
        ArrayList<String> content = new ArrayList(); 
        while((x = r.readLine()) != null) 
        { 
         content.add(x); 
        } 
        in.close(); 
        r.close(); 
        ar= content.toArray(new String[content.size()]); 

       } 
       catch(Exception e1){ 
        handler.sendEmptyMessage(0); 
       } 

      } 

     }); 

     dt.start(); 
     try{ 
      dt.join(); 

     }catch(Exception e){ 
      handler.sendEmptyMessage(0); 
     } 

    try{ 
     if(ar[0].toString().trim()!="") 
     { 
      android.view.Display display1 = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
      TableLayout tbl1 = (TableLayout)findViewById(R.id.tableLayout2); 

      TableRow newRow1 = (TableRow) new TableRow(this); 
      TextView txt=(TextView) new TextView(this); 
      txt.setText("No"); 
      txt.setGravity(Gravity.LEFT); 
      txt.setTextColor(Color.RED); 
      txt.setTextSize(18); 

      TextView txt1=(TextView) new TextView(this); 
      txt1.setText("NAME"); 
      txt1.setTextColor(Color.RED); 
      txt1.setTextSize(18); 
      txt1.setGravity(3); 

      TextView txt2=(TextView) new TextView(this); 
      txt2.setText("DATE"); 

      txt2.setTextColor(Color.RED); 
      txt2.setTextSize(18); 
      txt.setGravity(3); 

      TextView txt3=(TextView) new TextView(this); 
      txt3.setText("VALUE"); 
      txt3.setTextColor(Color.RED); 
      txt3.setTextSize(18); 
      txt3.setGravity(Gravity.RIGHT); 


      txt.setWidth((int)(display1.getWidth()/4)); 
      txt1.setWidth((int)(display1.getWidth()/4)); 
      txt3.setWidth((int)(display1.getWidth()/4)); 
      txt2.setWidth((int)(display1.getWidth()/4)); 


      newRow1.addView(txt2); 
      newRow1.addView(txt); 
      newRow1.addView(txt1); 
      newRow1.addView(txt3); 
      tbl1.addView(newRow1); 

      for(int t=0;t<(ar.length);t++) 
      { 
      android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
      TableLayout tbl = (TableLayout)findViewById(R.id.tableLayout1); 
      TableRow newRow = (TableRow) new TableRow(this); 
      newRow.setClickable(true); 
      TextView tx=(TextView) new TextView(this); 
      String temp=ar[t].toString(); 
      tx.setText(temp); 
      tx.setTextColor(Color.WHITE); 
      tx.setGravity(Gravity.LEFT); 
      tx.setTextSize(15); 

      t=t+1; 

      TextView tx1=new TextView(this); 
      tx1.setText(ar[t].toString()); 
      tx1.setGravity(Gravity.LEFT); 
      tx1.setTextColor(Color.WHITE); 
      tx1.setTextSize(15); 


      t=t+1; 

      TextView tx2=new TextView(this); 
      tx2.setText(ar[t].toString()); 
      tx2.setGravity(Gravity.LEFT); 
      tx2.setTextColor(Color.WHITE); 
      tx2.setTextSize(15); 

      t=t+1; 

      TextView tx3=new TextView(this); 
      tx3.setText(ar[t].toString()); 
      tx3.setGravity(Gravity.RIGHT); 
      tx3.setTextColor(Color.WHITE); 
      tx3.setTextSize(15); 

      tx3.setWidth((int)(display.getWidth()/4)); 
      tx.setWidth((int)(display.getWidth()/4)); 
      tx1.setWidth((int)(display.getWidth()/4)); 
      tx2.setWidth((int)(display.getWidth()/4)); 

      newRow.addView(tx); 
      newRow.addView(tx2); 
      newRow.addView(tx1); 
      newRow.addView(tx3); 

      newRow.setId(t); 

      tbl.addView(newRow); 
      } 

     } 
    } 
    catch(Exception e){ 
     pg.dismiss(); 
     handler.sendEmptyMessage(0); 
    } 

} 
private Handler handler = new Handler() { 
    @Override 
      public void handleMessage(Message msg) { 

     Toast.makeText(this,"Network not available!.... ", Toast.LENGTH_LONG).show(); 
} 
}; 
+0

написать это в свой улов блока 'runOnUiThread (новый Runnable() { \t \t \t \t \t \t \t \t @Override \t \t \t \t общественности недействительным запуска() { \t \t \t \t \t// TODO Автоматически сгенерированный метод заглушки \t \t \t \t \t pg.dismiss(); \t \t \t handler.sendEmptyMessage (0); \t \t \t \t} \t \t \t}); ' –

+0

Я думаю, вы не закрывать его после завершения вашего фонового процесса. Я только закрываю ваш ответ в catch catch. –

+0

Не пытайтесь поймать добавить строку после блока catch –

ответ

0

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

Thread thread = new Thread() { 

      public void run() { 
       try 
       { 
        pg.show(); 
        //long running task 
       } 
       catch(){ 
       } 

       handler.post(new Runnable() { 
        @Override 
        public void run() { 

         //code for Update UI after the long running task 


         // dismiss the progress dialog on UI thread 
         pg.dismiss(); 

        } 
       }); 

      } 
     }; 

     thread.start(); 
1

Добавить эту строку в любое место, где бы вы ни отклонили свой диалог.

if(pg.isShowing())pg.dismiss(); 
+0

Если я добавлю это, диалог «Прогресс» даже не отображается. Я запутался, что не так с моим кодом и где мне не хватает –

+0

почему вы не используете задачу async ???? – Andrain

+0

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

1

Вы закрываете ProgressDialog на исключение пункта Try

catch(Exception e){ 
     pg.dismiss(); 
     handler.sendEmptyMessage(0); 
    } 

Вот почему без исключения это не закроется

+0

Если я так дам, диалог прогресса продолжает работать –

+0

правильно, потому что исключение не поднято ... поэтому он продолжает работать ... – nitesh

+0

использовать блок finally мог бы решить проблему u r – nitesh

1

я должен пройти через ваш код, ваш диалог прогресса будет выйти, если и только если ваша программа выдает исключение. положить его сторону блока улова (после блока улова) следующий код

catch(Exception e){ 
    pg.dismiss(); 
    handler.sendEmptyMessage(0); 
} 

должен быть изменен на

catch(Exception e){ 
    handler.sendEmptyMessage(0); 
}finally{ 
    pg.dismiss(); 
} 

если выше не работает попытка переложить окончательно заблокировать, чтобы внутри потока запустить метод, как показано в следующем ..

Thread dt= new Thread(new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       String addr=Util.url; 
       URL url = new URL(urlname); 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.setConnectTimeout(5000);    
       InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
       BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
       String x = ""; 
       String total = ""; 
       int i=0; 
       ArrayList<String> content = new ArrayList(); 
       while((x = r.readLine()) != null) 
       { 
        content.add(x); 
       } 
       in.close(); 
       r.close(); 
       ar= content.toArray(new String[content.size()]); 

      } 
      catch(Exception e1){ 
       handler.sendEmptyMessage(0); 
      }finally{ 
       pg.dismiss(); 
      } 

     } 

    }); 
+0

Лучше использовать блок 'finally'. – Darkhogg

+0

очевидно, я отредактировал, добавив блок finally, thankx –

+0

Спасибо за предложение. Я изменился так, как вам было предложено, но Progress Dialog не отображается. –

1

заменить это:

catch(Exception e){ 
    pg.dismiss(); 
    handler.sendEmptyMessage(0); 
} 

к этому:

catch(Exception e){ 
    handler.sendEmptyMessage(0); 
} 
pg.dismiss(); 
1

пытаются использовать AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html

Пример кода:

AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 

    @Override 
    protected void onPreExecute() { 
     //Show UI 
     //Start your progress bar 

     showProgress(); 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     // do your bg process 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
         //Show UI 
     //dismiss your progress bar 
     hideProgress(); 
    } 

}; 
task.execute((Void[])null); 

Показать и скрыть диалоговое код прогресса

public void showProgress() { 
     progressDialog = ProgressDialog.show(this, "", 
       "Loading. Please wait..."); 
     progressDialog.setCancelable(false); 
    } 

public void hideProgress() { 
    if (progressDialog != null && progressDialog.isShowing()) { 
     progressDialog.dismiss(); 
    } 
1

Используйте AsyncTask и переместите весь сетевой код в doInBackground(). Покажите ProgressDialog в onPreExecute() от AsyncTask и спрячьте его в onPostExecute().

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

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showProgressDialog(R.string.please_wait); 
    } 

    @Override 
    protected Response doInBackground(String... params) { 
      try { 
       // Do the network stuff here 
      } catch (Exception ex) { 
       // Handle exception 
      } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(Response result) { 
     super.onPostExecute(result); 
     hideProgressDialog(); 
     // Do the response handling here 
    } 
}  

private void showProgressDialog(int resId) { 
    if (progressDialog != null && progressDialog.isShowing()) { 
     progressDialog.setMessage(getString(resId)); 
    } else { 
     progressDialog = ProgressDialog.show(this, "", getString(resId), false); 
    } 
} 

private void hideProgressDialog() { 
    try { 
     if (progressDialog != null && progressDialog.isShowing()) { 
      progressDialog.dismiss(); 
     } 
    } catch (Exception ex) { 
     Log.e(TAG, ex.getMessage(), ex); 
    } 
} 

Надеюсь, это поможет.

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