0

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

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

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

4

5 回答 5

1

你不能做一个Toastin doInBackground,你会得到Can't create handler inside thread that has not called Looper.prepare()

如果只是在此阶段进行测试(您的代码似乎暗示了这一点),请考虑暂时只编写一些日志输出。

或者把你Toast的或者onPreExecuteonPostExecute

更多信息:如何在 AsyncTask 中举杯,提示我使用 Looper

于 2013-07-26T11:20:29.353 回答
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 个步骤部分下的主题。

于 2013-07-26T11:20:28.687 回答
0

您无法从后台线程访问 UI 线程。

于 2013-07-26T11:21:02.370 回答
0

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

因此,AsyncTaskrun on 的方法不同ThreadsdoInBackground在后台线程中 onProgressUpdate运行和onPostExecute在 UI 上运行Thread

现在,您只能在 UI Thread(=main Thread) 中修改 UI。这就是您的代码导致崩溃的原因。简单地搬进ToastonPostExecute就能解决你的问题。

于 2013-07-26T11:25:33.717 回答
0
 runOnUiThread(new Runnable() {
                   @Override
                   public void run() { 
                    Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show();
                   }
                });`

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

于 2015-03-03T07:11:04.413 回答