异步工作者崩溃应用程序

时间:2013-07-26 11:19:04

标签: android android-asynctask

我在主类中为异步工作者编写了以下代码

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();
    }

有人可以告诉我出了什么问题吗?

5 个答案:

答案 0 :(得分:1)

您无法在Toast中执行doInBackground,您将获得Can't create handler inside thread that has not called Looper.prepare()

如果它仅用于此阶段的测试(您的代码似乎意味着),请考虑现在只编写一些日志输出。

或者将Toast onPreExecuteonPostExecute

放入

更多信息: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)

AsyncTaskThreadsHandlers的助手。它可以帮助您执行后台任务并定期更新UI。

因此,AsyncTask的方法在不同的Threads上运行: doInBackground在后​​台线程中运行 用户onProgressUpdate上运行onPostExecuteThread

现在,您只能修改用户界面Thread(=主Thread)中的用户界面。这就是您的代码导致崩溃的原因。只需将Toast移至onPostExecute即可解决您的问题。

答案 4 :(得分:0)

 runOnUiThread(new Runnable() {
                   @Override
                   public void run() { 
                    Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show();
                   }
                });`

尝试在主线程上完成所有ui工作。

相关问题