当异步任务在后台线程中运行时,点击UI后台中的任何按钮都会导致应用程序崩溃



我从外部服务器获取数据,并在android的listview中填充它。在异步任务期间,我在UI线程中显示"加载"对话框。UI还在后台显示了两个按钮。单击这些按钮后,ListAdapter被附加到listview并显示数据。但是由于后台线程仍然在运行,所以列表适配器是空的,不包含任何数据,所以点击这些按钮应用程序崩溃显示空指针例外。那么如何使后台UI(UI下的"加载对话框")无响应,而后台线程正在运行?还是有其他的解决办法?

如果你想在运行AsyncTask时停止与UI的所有交互,显示一个ProgressDialog并使其不可取消。比如:

public class MainActivity extends Activity {
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
    }
    class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        private ProgressDialog mProgress;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Show ProgressDialog
            mProgress = new ProgressDialog(mContext);
            mProgress.setCancelable(false);
            mProgress.setCanceledOnTouchOutside(false);
            mProgress.setTitle("Fetching data");
            mProgress.show();
        }
        ...
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            // Hide ProgressDialog when done loading
            mProgress.dismiss();
        }
    }
}

这样,当doInBackground运行时,您的UI将不可点击。

你肯定应该从开始的事件添加一个适配器到你的ListView,尽管它将是空的。
然后,当AsyncTask完成后,只需更新适配器的内容。

最新更新