2012-04-27 5 views
0

У меня есть задача Async получить некоторые данные из Интернета. Async Task работает отлично, и я хочу, чтобы в диалоговом окне «Прогрессивный диалог» отображался индикатор выполнения, пока данные закупаются из Интернета. Диалоговое окно «Прогресс диалога» никогда не появляется. Вот мой код:ProgressDialog не отображается

public class JsonHttpParsingActivity extends ListActivity{ 
private String jsonResult; 
private ArrayList nameArray; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    HttpConnection task = new HttpConnection(this); 
    AsyncTask<String,Void,String> taskResult = task.execute("Some URL..."); 
    try { 
     jsonResult = taskResult.get(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
      . 
      . 
      More Code..... 
} 
} 

public class HttpConnection extends AsyncTask<String, Void, String> { 
private ProgressDialog progressDialog; 
private Activity m_activity; 

protected HttpConnection(Activity activity) { 
    setActivity(activity); 
    } 

    public void setActivity(Activity activity) { 
    m_activity = activity; 

    progressDialog = new ProgressDialog(m_activity); 
    progressDialog.setMessage("Wait ..."); 
    progressDialog.setCancelable(false); 
    progressDialog.setMax(100); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressDialog.show(); 
    } 

@Override 
protected String doInBackground(String... params) { 
    BufferedReader in = null; 
    String inputLine= "", finalMessage = ""; 
    HttpURLConnection urlConnection = null; 

    try { 
     String urladdress = params[0]; 
     URL url = new URL(urladdress); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

     while((inputLine = in.readLine()) != null){ 
      finalMessage = finalMessage + inputLine; 
     } 
     in.close(); 
     Log.v("finalmessage", ""+finalMessage); 
    } 
    catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     urlConnection.disconnect(); 
    }  
    return finalMessage; 
} 
protected void onProgressUpdate(Integer... values) { 
    progressDialog.setProgress((int) ((values[0]/(float) values[1]) * 100)); 
    }; 

@Override 
protected void onPostExecute(String result){ 
     progressDialog.hide(); 
} 
} 

Спасибо!

ответ

1

Вместо написать отдельный метод setActivity(activity) (Non UI сфера Thread) для запуска ProgressDialog поместить код в onPreExecute() (UI Thread) из AsyncTask, потому что вы пытаетесь показать его в не потоке пользовательского интерфейса.

Попробуйте это,

protected HttpConnection(Activity activity) { 
    m_activity = activity; 
    } 

Override 
protected void onPreExecute(String result){ 
    progressDialog = new ProgressDialog(m_activity); 
    progressDialog.setMessage("Wait ..."); 
    progressDialog.setCancelable(false); 
    progressDialog.setMax(100); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressDialog.show(); 

} 
+0

Я пробовал это раньше .. не работал для меня. – user988639

+1

+1 @ user988639 Это точный способ. –

1

Зов прогресс бар от onPreExecute функции()

+0

Я пробовал, и это не сработало. – user988639

0

Следующий код работает отлично и испытываться:

public class HttpConnection extends AsyncTask<String, Void, String> { 
    private ProgressDialog progressDialog; 
    private Activity m_activity; 

    protected HttpConnection(Activity activity) { 

     } 

     @Override 
    protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    progressDialog = new ProgressDialog(m_activity); 
     progressDialog.setMessage("Wait ..."); 
     progressDialog.setCancelable(false); 
     progressDialog.setMax(100); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progressDialog.show(); 

    super.onPreExecute(); 
} 

    @Override 
    protected String doInBackground(String... params) { 
     BufferedReader in = null; 
     String inputLine= "", finalMessage = ""; 
     HttpURLConnection urlConnection = null; 

     try { 
      String urladdress = params[0]; 
      URL url = new URL(urladdress); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

      while((inputLine = in.readLine()) != null){ 
       finalMessage = finalMessage + inputLine; 
      } 
      in.close(); 
      Log.v("finalmessage", ""+finalMessage); 
     } 
     catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      urlConnection.disconnect(); 
     }  
     return finalMessage; 
    } 


    @Override 
    protected void onPostExecute(String result){ 
      progressDialog.hide(); 
    } 
    } 
+0

Нет, его не работает ..! progressDialog = новый ProgressDialog (m_activity); эта строка дает исключение .. Поскольку m_activity не инициализируется. – user370305

+0

Инициализировал m_activity в конструкторе и поместил код из setActivity() в onPreExecute() (поток пользовательского интерфейса), но по-прежнему не имеет диалогов прогресса. – user988639

+0

@ user370305: Просто используйте любую ссылку на экземпляр Context. Поскольку ваш 'AsyncTask' реализован как внутренний класс, вы можете также использовать' JsonHttpParsingActivity.this' –

0

Попробуйте называть AsyncTask из другого метода активность. Я предполагаю, что сейчас вы называете это методом onCreate. Поскольку деятельность по-прежнему строится, это может дать вам исключения. Одна вещь, которую я когда-то пробовал, когда у меня возникла эта проблема, запускает асинхронную задачу из метода onPostCreate.

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