我有一个Android应用程序,我遇到了麻烦。
基本上ProgressDialog
根本没有显示。我认为这是某种线程问题,但我不知道如何修复它。
我正在使用ActionBarSherlock
一些Fragments
。我也在使用新的Android DrawerLayout
,我在抽屉上有我的选项,点击后会替换片段。
首次加载我的应用程序时,我想检查数据库以查看是否已下载初始数据。如果没有,那么我就开始AsyncTask
开始下载数据。在这期间,这应该有ProgressDialog
显示,但它不是。
有人能看到我哪里错了吗?感谢。
MainScreen - 应用打开时的默认着陆页/片段
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,请注意我在每个构造函数中设置activity
。
感谢。
答案 0 :(得分:10)
从.get()
删除return new HttpConnection(activity).execute().get();
您基本上是锁定了您的UI线程。删除后,它应该可以正常工作。
目的是异步,因此boolean downloadData()
的返回类型应为void
。如果你需要对数据做一些事情,那么你应该实现一个接口“listener”并将它传递给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);
}
答案 1 :(得分:0)
我的问题不是他们在execute()方法之后调用get()方法的常见问题。我的问题是我传递给AsyncTask方法的Context。我有一个settingsActivity,我有一个调用asynctask任务的ReadMeActivity。我没有使用被调用的上下文(ReadMeActivity.this),而是使用了settingsActivity来阻止它被看到。一旦我切换它并传递了活动被调用的上下文就行了。
希望它可以帮助别人。