我在主类中为异步工作者编写了以下代码
private class Renderer extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show();
return null;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
}
}
但是调用它会使应用程序崩溃
public void render(View v)
{
new Renderer().execute();
}
有人可以告诉我出了什么问题吗?
答案 0 :(得分:1)
您无法在Toast
中执行doInBackground
,您将获得Can't create handler inside thread that has not called Looper.prepare()
。
如果它仅用于此阶段的测试(您的代码似乎意味着),请考虑现在只编写一些日志输出。
或者将Toast
onPreExecute
或onPostExecute
更多信息:How to raise a toast in AsyncTask, I am prompted to used the Looper
答案 1 :(得分:0)
您正在doInbackground
展示吐司,这是不可能的。在onPostExecute
protected void onPostExecute(Long result) {
Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show();
}
在后台线程上调用 doInbackground
。你应该在ui线程上更新ui。您可以在onProgressUpdate
显示吐司。
的更多信息
http://developer.android.com/reference/android/os/AsyncTask.html
查看 4个步骤部分下的主题。
答案 2 :(得分:0)
您无法从后台线程访问UI线程。
答案 3 :(得分:0)
AsyncTask
是Threads
和Handlers
的助手。它可以帮助您执行后台任务并定期更新UI。
因此,AsyncTask
的方法在不同的Threads
上运行:
doInBackground
在后台线程中运行
用户onProgressUpdate
上运行onPostExecute
和Thread
。
现在,您只能修改用户界面Thread
(=主Thread
)中的用户界面。这就是您的代码导致崩溃的原因。只需将Toast
移至onPostExecute
即可解决您的问题。
答案 4 :(得分:0)
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show();
}
});`
尝试在主线程上完成所有ui工作。