gpt4 book ai didi

Android - 进度对话框不显示在 AsyncTask 中

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:59 24 4
gpt4 key购买 nike

我有一个 Android 应用程序遇到了问题。

基本上 ProgressDialog 根本没有显示。我认为这是某种线程问题,但我不知道如何解决。

我正在使用 ActionBarSherlock 和一些 Fragments。我还在使用新的 Android DrawerLayout,我在抽屉上有我的选项,点击时会替换 fragment 。

第一次加载我的应用程序时,我想检查数据库以查看是否已下载初始数据。如果没有,那么我将开始一个 AsyncTask 来下载数据。这应该有一个 ProgressDialog 显示在此期间,但它没有。

有人能看出我哪里错了吗?谢谢。

MainScreen - 应用打开时的默认登陆页面/fragment

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。下载完成后,将加载 fragment 。所以它工作正常,除了缺少 ProgressDialog

注意,我在每个构造函数中设置了 activity

谢谢。

最佳答案

return new HttpConnection(activity).execute().get(); 中删除 .get() 您基本上锁定了 UI 线程。一旦删除,它应该像 AsyncTasks 一样工作。

目的是异步,所以 boolean downloadData() 应该有 void 的返回类型。如果您需要对数据执行某些操作,那么您应该实现一个接口(interface)“监听器”并将其传递给 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);
}

关于Android - 进度对话框不显示在 AsyncTask 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18236973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com