У меня есть приложение для 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
в каждом конструкторе.
Спасибо.
Привет, человек.Очень ценим! Я должен сделать! – eoinzy
get() был проблемой и в моем случае. Спасибо за информацию!!! –
@ J.Romero Действительно полезно +1 – rup35h