2013-07-26 50 views
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(); 
    } 

有人能告诉我什么错?

回答

1

你不能在doInBackgroundToast,你会得到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

+0

即使在Onpostexecute.App中放置烤面包后也不起作用 – techno

+0

您的'AsyncTask'错误。把'@ Override'放在所有的方法之前,并遵循eclipse告诉你做的事情。 'onPostExecute()'根本就没有被调用,因为方法签名应该是'protected void onPostExecute(Void result){'根据你的'AsyncTask'声明。 **短回答**:将onPostExecute更改为'(Void result)'NOT'(Long result)'并且它将工作 –

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个步骤部分的话题。

+0

好吧,但即使在Onpostexecute.App中放置烤面包后也不工作 – techno

0

您不能从后台线程访问UI线程。

0

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

因此,AsyncTask运行的不同Threads方法: doInBackground在后台线程中运行 onProgressUpdateonPostExecute在UI Thread运行。

现在,您只能修改UI Thread(=主Thread)中的UI。这就是为什么你的代码会导致崩溃。只需将Toast转换为onPostExecute即可解决您的问题。

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

尝试在主线程上做所有的UI工作。