AsyncTask不工作,我不知道为什么

时间:2014-08-22 07:14:34

标签: java android asynchronous android-asynctask

所以我试图让一个按钮创建一个重复的动作,我发现一些代码建议这样做,我没有在日食中得到任何错误,但当我运行应用程序并按下按钮时它强制关闭,我不确定你是否需要我的原木猫但是如果你这样做请告诉我并且发布它。

 @SuppressWarnings("rawtypes")
    class MyAsyncTask extends android.os.AsyncTask {
                    @Override
                    protected Object doInBackground(Object[] objects) {
                        int upCounter = 0;
                        try {
                            Thread.sleep(700);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        upCounter++;
                        Money = Money+5;
                        MoneyDis.setText("$"+Money);

                        return null;
                    }
                }

    UpGradeRep.setOnClickListener(new View.OnClickListener() {

        @SuppressWarnings("unchecked")
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            (new MyAsyncTask()).execute();

        }
    });

3 个答案:

答案 0 :(得分:0)

MoneyDis.setText("$"+Money);

绝对是错的。你必须在UI线程中调用它。 将其移至:

@Override
        protected void onPostExecute(int Money) {
            // TODO Auto-generated method stub
            MoneyDis.setText("$"+Money);
        }

了解Google提供的一些代码:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

参考:http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:0)

内部setText将检查当前线程是否为 main / UI线程,否则将抛出异常。显然,doInBackground正在子线程中运行,这将引发该异常

答案 2 :(得分:0)

您无法访问doInBackground()中活动中显示的视图,因为它适用于后台线程。尝试使用WeakReference获取活动的参考 或覆盖onProgressUpdate(),更改其中的textView内容,只需在每次要更新publishProgress(counter)时调用textView