当异步任务在后台线程中运行时,应用程序在单击UI背景中的任何按钮时崩溃

时间:2014-08-23 20:17:14

标签: android multithreading android-asynctask

我从外部服务器获取数据并在android中的列表视图中填充它。在异步任务中我显示'正在加载' UI线程中的对话框.UI还在后台显示两个按钮。单击这些按钮,ListAdapter将附加到列表视图,并显示数据。 但由于后台线程仍在运行,因此列表适配器为空并且不包含任何数据,因此在单击这些按钮时,应用程序崩溃,显示空指针除外。 那么如何在后台线程运行时使背景UI(在“加载对话框”下面的UI)无响应?或者还有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

如果要在运行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将无法点击。

答案 1 :(得分:0)

你肯定应该从头开始为你的ListView添加一个适配器,即使它是空的 然后,当您的AsyncTask完成后,只需更新适配器的内容。