Cra*_*der 5 android textview android-asynctask
在我的一个应用程序中,我有一个场景,我需要做一些后台任务.为此,我使用异步任务.我也在使用自定义进度对话框.下面是自定义进度对话框的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:orientation="vertical" >
<ProgressBar
android:layout_width="60dp"
android:layout_height="60dp"
android:indeterminateDrawable="@drawable/progressloader"
android:layout_gravity="center"/>
<TextView
android:id="@+id/progressMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="18sp"
android:text="Please wait...." />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
一切正常,但当我尝试将文本设置为TextView时,我得到java NullPointerException.
AsyncTask代码
private class InitialSetup extends AsyncTask<String, Integer, Long> {
ProgressDialog dialog = new ProgressDialog(getParent(),R.style.progressdialog);
@Override
protected void onPreExecute() {
dialog.show();
dialog.setContentView(R.layout.progressbar);
}
@Override
protected Long doInBackground(String... urls) {
// txtView.setText("Testing"); here I am getting the error
fetchDetails();
return 0;
}
@Override
protected void onPostExecute(Long result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
populateUI(getApplicationContext());
}
}
Run Code Online (Sandbox Code Playgroud)
主要活动
public class SummaryActivity extends Activity {
final TextView txtView = (TextView)findbyid(R.id.progressMessage);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.accountsummary);
new InitialSetup().execute("");
}
}
Run Code Online (Sandbox Code Playgroud)
den*_*isg 14
如果我理解正确,您TextView可以在xml文件progressbar.xml(即R.layout.progressbar)中找到要设置文本的内容.TextView一旦设置了内容视图(使用setContentView()),就可以获得这一点.在您的代码中,您在此调用之前设置它和mussharapp的代码,他正在提前调用它.也就是说,他在setContentView(R.layout.accountsummary)不包含电话的电话之后拨打电话TextView.因此,变量txtView将为NULL,您将得到一个NullPointerException.
你应该做的是以下几点:
onPreExecute后设置变量txtView in setContentView.对于代码,请查看以下内容:
private class InitialSetup extends AsyncTask<String, Integer, Long> {
ProgressDialog dialog = new ProgressDialog(getParent(),R.style.progressdialog);
// The variable is moved here, we only need it here while displaying the
// progress dialog.
TextView txtView;
@Override
protected void onPreExecute() {
dialog.show();
dialog.setContentView(R.layout.progressbar);
// Set the variable txtView here, after setContentView on the dialog
// has been called! use dialog.findViewById().
txtView = dialog.findViewById(R.id.progressMessage);
}
@Override
protected Long doInBackground(String... urls) {
// Already suggested by Paresh Mayani:
// Use the runOnUiThread method.
// See his explanation.
runOnUiThread(new Runnable() {
@Override
public void run() {
txtView.setText("Testing");
}
});
fetchDetails();
return 0;
}
@Override
protected void onPostExecute(Long result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
populateUI(getApplicationContext());
}
}
Run Code Online (Sandbox Code Playgroud)
Par*_*ani 12
是的,因为你试图在doInBackground()方法中设置TextView,这是不允许的,
为什么不允许?因为只有一个Thread运行是UI主线程,并且不允许从线程进程更新UI.在这里阅读更多信息:无痛线程
因此,有一个解决方案,如果你想设置的doInBackground()方法中TextView的,做UI更新内部操作runOnUiThread方法.
否则,建议在onPostExecute()方法中执行所有UI显示/更新相关操作,而不是AsyncTask类的doInBackground()方法.
| 归档时间: |
|
| 查看次数: |
42179 次 |
| 最近记录: |