2011-11-01 235 views
-1

我已经创建了一个异步任务是这样的:异步任务

private class LongOperationcheckall extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String result="Start"; 
     try 
     { 
      Looper.myLooper().prepare(); 
      // Looper.loop(); 

      // TODO Auto-generated method stub 
      for(int k=0;k<13;k++) 
      { 
       checkall(); 
       this.publishProgress("Show the dialog"); 

       //count++; 
      } 

      result="Success"; 
      checkallcomp++; 

      OnscanComplete(); 
     } 
     catch(Exception ex) 
     { 
      checkallcomp++; 
      OnscanComplete(); 
     } 
     return result; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     Log.i("Progress", "Progressincheck"); 
    } 

    protected void onPostExecute(String params) { 
     Log.w("all Check",params); 

     // Execution of result of Long time consuming operation 
    } 
} 

我加入的代码,

Looper.myLooper().prepare(); 

调用这个任务,因为

taskAllcheck = new LongOperationcheckall(); 
taskAllcheck.execute(); 

第四次时,我第四次点击开始按钮,它给出了例外

无法创建内部线程的线程这不叫looper.prepare只有

,当我在设备运行执行模拟器OK内部处理,但之后添加此行,在错误出现因为当我第四次单击开始按钮时,每个线程只能创建一个活套,并致电taskAllcheck.execute();

+0

checkall()方法做什么? “无法创建处理程序...”异常通常发生在您尝试执行只允许在后台线程中执行的操作时发生。 – Egor

+0

checkall()只检查设置如开启或关闭蓝牙,gps在设备上或关闭,并根据它在数据库中更新状态 –

+0

这就是我所说的。也许,这些是必须在UI线程上执行的操作。你可以将它们放到activity.runOnUIThread()方法的Runnable中,这样你就可以克服Looper异常。 – Egor

回答

-1

请把异步线程想象成一个UI线程,它有一个内置的处理程序来更新你的UI。无论如何,这是一条线索。所以现在已经清除了,我没有看到你在哪里写了checkall()函数。检查所有函数需要是异步任务在后台调用的本地方法。它不能成为你的主课堂中的一种方法。如果是这种情况,那么就没有任何异步任务的意义。所以请将checkall()函数添加到您的异步任务中。

接下来,在异步任务中不需要活套。数据的处理由以下处理:

this.publishProgress(“Show the dialog”);

请确保你传入任何你想要的东西。可以是int,string,boolean,array或任何东西都可以在这里处理。因此,明智地使用实施。

现在,相应地在onProgressUpdate()的内部进行设置,因此也请检查是否要执行UI线程中的某些内容,如方法或其他内容。这可以用这种方法完成。

现在进行我已告诉您的更改。请回到我身边,我会更好地与你合作。如果我们能指出问题。保重。

+0

感谢Peter的编辑。我会牢记在心。 – medampudi