4

У меня есть приложение для Android, с которым у меня проблемы.Android - progressdialog не отображается в AsyncTask

В основном ProgressDialog вообще не отображается. Я считаю, что это проблема с потоками, но я не знаю, как ее исправить.

Я использую ActionBarSherlock с некоторыми Fragments. Я также использую новый Android DrawerLayout, где у меня есть мои варианты на ящике, которые заменяют фрагмент при нажатии.

При первой загрузке моего приложения я хочу проверить базу данных, чтобы узнать, загружены ли исходные данные. Если нет, тогда я ухожу и начинаю AsyncTask, чтобы загрузить данные. В течение этого СЛЕДУЕТ иметь дисплей ProgressDialog, но это не так.

Может кто-нибудь увидеть, где я иду не так? Благодарю.

В начало - Посадочная страница по умолчанию/фрагмент, когда приложение открывает

public class MainScreen extends SherlockFragment { 
    public static final String TAG = "MainScreen"; 

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

     ImageView imgLogo = (ImageView) rootView.findViewById(R.id.imgMainScreen); 
     imgLogo.setOnClickListener(new ButtonHandler(getActivity())); 

     checkDatabase(); 
     return rootView; 
    } 

    private void checkDatabase() { 
     //Ensure there is data in the database 
     DBHelper db = new DBHelper(this.getSherlockActivity()); 
     db.checkDatabase(); 
    } 
... 
} 

DBHelper.checkDatabase() - метод, который инициирует скачать

public void checkDatabase() { 
    if (isEmpty()) { 
     //Connect to net and download data 
     NetworkManager nm = new NetworkManager(activity); 
     if (!nm.downloadData()) { 
      Toast.makeText(activity, R.string.internetCheck, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

и, наконец, NetworkManager.downloadData() - Метод, который запускает AsyncTask:

public boolean downloadData() { 
     try { 
      return new HttpConnection(activity).execute().get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 

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

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

     @Override 
     protected void onPreExecute() { 
      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 Boolean doInBackground(Void... params) { 
      String[] types = new String[]{"type1", "type2", "type3", "type4", }; 
      StringBuilder sb = new StringBuilder(); 

      for(String type : types) { 
       sb = new StringBuilder(); 
       if(DBHelper.TYPE4_TABLE.equals(type)) { 
        InputStream is = activity.getResources().openRawResource(R.raw.dbdata); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
        try { 
         sb.append(reader.readLine()); 
        } catch (IOException e) { 
         Toast.makeText(activity.getApplicationContext(), "Error retriveving data", Toast.LENGTH_SHORT).show(); 
         Log.e(Constants.TAG, "Error reading data"); 
         e.printStackTrace(); 
        } 
       } else { 
        sb = fetchURLData(Constants.ALL_URL+type); 
       } 
       cleanDataAndStore(sb, type); 
      } 

      return true; 
     } 

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

Используя код выше, все это я получаю белый экран, как приложение пытается загрузить, а иногда ANR. Когда загрузка выполняется, фрагмент загружается. Таким образом, он отлично работает, за исключением недостающих ProgressDialog.

PS, Notice Я устанавливаю activity в каждом конструкторе.

Спасибо.

ответ

10

Удалить .get() от return new HttpConnection(activity).execute().get(); Вы в основном запираете свою нить пользовательского интерфейса. После удаления он должен работать, поскольку ожидается, что AsyncTasks будет работать.

Цель должна быть асинхронной, поэтому boolean downloadData() должен иметь тип возврата void. Если вам нужно что-то сделать с данными, тогда вы должны реализовать интерфейс «слушатель» и передать его в AsyncTask.

Пример СЛУШАТЕЛЬ:

class TaskConnect extends AsyncTask<Void, Void, ConnectionResponse> { 

    private final AsyncTaskListener mListener; 

    /** 
    * 
    */ 
    public TaskConnect(AsyncTaskListener listener) { 
     ... 
     mListener = listener; 
    } 

    @Override 
    protected void onPreExecute() { 
     if (mListener != null) { 
      mListener.onPreExecute(mId); 
     } 
    } 

    @Override 
    protected ConnectionResponse doInBackground(Void... cData) { 
     ... 
     return responseData; 
    } 

    @Override 
    protected void onPostExecute(ConnectionResponse response) { 
     if (mListener != null) { 
      mListener.onComplete(response); 
     } else { 
      LOG.w("No AsyncTaskListener!", new Throwable()); 
     } 
    } 
} 

public interface AsyncTaskListener { 
    public abstract void onPreExecute(int id); 
    public abstract void onComplete(ConnectionResponse response); 
} 
+0

Привет, человек.Очень ценим! Я должен сделать! – eoinzy

+0

get() был проблемой и в моем случае. Спасибо за информацию!!! –

+0

@ J.Romero Действительно полезно +1 – rup35h

0

Мой вопрос не был общий вопрос о других, где они были вызова метода() метод после выполнения() получить. Моя проблема была в Контексте, который я перешел к моему методу AsyncTask. У меня есть параметрActivity, и у меня есть ReadMeActivity, который вызывает задачу asynctask. Вместо использования контекста, в котором он был вызван (ReadMeActivity.this), я использовал настройкиActivity, которые мешали ему видеть. Как только я переключил его и передал ему контекст, в котором была названа деятельность, это сработало.

Надеюсь, что это поможет кому-то еще.

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