单击按钮后我的应用程序崩溃,但代码执行正常。
public void makeLead(View v) throws Exception {
try {
RegisterTimer rt = new RegisterTimer();
rt.ma = this;
rt.execute(null);
} catch (Exception e) {
e.printStackTrace();
}
}
public void log(String msg)
{
final TextView tv = (TextView)findViewById(R.id.editText);
tv.append(msg);
}
private class RegisterTimer extends AsyncTask {
public MainActivity ma;
@Override
protected Object doInBackground(Object[] objects) {
ma.log("ausd");
return null;
}
}
makeLead
是onClick
事件。方法ma.log生成错误但工作正常(msg已添加到textEdit
)。当我删除ma.log时,应用程序不会崩溃。我的AndroidStudio中没有日志,因此无法看到错误消息。怎么了?
答案 0 :(得分:2)
您无法从doInbackground
更新ui。不需要初始化ma
使AsyncTask成为Activity的内部类,并在onPostExecute
或使用interface作为活动的回调
编辑:
要说清楚
活动
TextView tv;
@Override
public void onCreate(Bundle savedInstancestate)
super.onCreate(savedInstancestate);
setContentView(R.layout.yourlayout);
tv = (TextView)findViewById(R.id.editText);
然后
@Override
protected String doInBackground(Void objects) {
// some background computation
return "ausd";
}
在onpostExecute
@Override
protected void onPostExecute(String result)
{
super.onPostExecute();
tv.append(result);
}
你还需要
private class RegisterTimer extends AsyncTask<Void,Void,String> { // args missing
答案 1 :(得分:2)
您无法触摸非UI线程中的View
。
并且您要在背景TextView
中将文字附加到Thread
,这是不允许的。
我希望MainActivity
内RegisterTimer
的初始化没有问题,因为您没有手动创建Activity
实例。初始化rt.ma = this
正确。
为什么仅仅需要更改AsyncTask
TextView
答案 2 :(得分:1)
如@Raghunandan所述,你还没有初始化ma。
接下来是你无法访问后台线程中的视图。
如果您的线程类在MainActivity类中,那么您可以使用
runOnUiThread(new Runnable() {
@Override
public void run() {
ma.log("ausd");
}
});
在doInBackground方法中更新视图。
答案 3 :(得分:0)
您的方法日志是公共的,您不需要使MainActivity
类的对象访问它,而是可以直接调用它。此外,您需要在ASYNC
任务后添加一些模板,如果您想将一些输入传递给后台进程,那么您正在以错误的方式使用ASYNC
任务。