2011-06-20 75 views
0

有人可以帮我吗?我显然做错了,我似乎无法自己弄清楚。基本上,doInBackground()方法未运行。AsyncTask没有执行

这是磨片整类文件的代码调用它的线

电话:

new MyTimer().execute(); 

文件:

public class MyTimer extends AsyncTask<Object, Object, Object> { 

Timer _timerTask = new Timer(); 
static int totalSeconds = 1, hour = 0, min = 0, sec = 0; 
static String mTimeFormat = "%02d:%02d:%02d"; 
static String timeTakenString; 

@Override 
protected Object doInBackground(Object... params) { 

     TimerTask timer = new TimerTask() { 
      @Override 
      public void run() { 

       GPSMain.printscreen(); 
       totalSeconds += 1; 
       sec += 1; 
       if(sec >= 60) { 
        sec = 0; 
        min += 1; 
        if (min >= 60) { 
         min = 0; 
         hour += 1; 
        } 
       } 
       timeTakenString = String.format(mTimeFormat, hour, min, sec); 
       onPostExecute(timeTakenString); 

      } 
     }; 
     (_timerTask).scheduleAtFixedRate(timer,1000,1000); 
     return timeTakenString; 


} 
protected void onPostExecute(String timeTaken) { 
    GPSMain.timer.setText("Time Taken: "+timeTaken); 
} 
} 

编辑1:

logcat的:

06-20 10:18:20.036: DEBUG/AndroidRuntime(312): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 
06-20 10:18:20.046: DEBUG/AndroidRuntime(312): CheckJNI is ON 
06-20 10:18:20.225: DEBUG/AndroidRuntime(312): --- registering native functions --- 
06-20 10:18:20.506: DEBUG/ddm-heap(312): Got feature list request 
06-20 10:18:20.865: INFO/ActivityManager(52): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=Hartford.gps/.GPSMain } 
06-20 10:18:20.925: DEBUG/AndroidRuntime(312): Shutting down VM 
06-20 10:18:20.944: DEBUG/dalvikvm(312): DestroyJavaVM waiting for non-daemon threads to exit 
06-20 10:18:20.944: DEBUG/dalvikvm(312): DestroyJavaVM shutting VM down 
06-20 10:18:20.944: DEBUG/dalvikvm(312): HeapWorker thread shutting down 
06-20 10:18:20.944: DEBUG/dalvikvm(312): HeapWorker thread has shut down 
06-20 10:18:20.976: DEBUG/jdwp(312): JDWP shutting down net... 
06-20 10:18:20.976: INFO/dalvikvm(312): Debugger has detached; object registry had 1 entries 
06-20 10:18:20.985: ERROR/AndroidRuntime(312): ERROR: thread attach failed 
06-20 10:18:20.985: DEBUG/dalvikvm(312): VM cleaning up 
06-20 10:18:21.175: DEBUG/dalvikvm(312): LinearAlloc 0x0 used 638596 of 5242880 (12%) 
06-20 10:18:21.495: INFO/ActivityManager(52): Displayed activity Hartford.gps/.GPSMain: 604 ms (total 24251 ms) 
06-20 10:18:23.365: INFO/NotificationService(52): enqueueToast pkg=Hartford.gps [email protected] duration=1 
06-20 10:18:23.545: DEBUG/GpsLocationProvider(52): setMinTime 250 
06-20 10:18:23.545: DEBUG/GpsLocationProvider(52): startNavigating 
06-20 10:18:24.206: DEBUG/LocationManager(287): removeUpdates: listener = [email protected] 
06-20 10:18:24.206: DEBUG/GpsLocationProvider(52): stopNavigating 
06-20 10:18:26.146: WARN/KeyCharacterMap(287): No keyboard for id 0 
06-20 10:18:26.146: WARN/KeyCharacterMap(287): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
06-20 10:18:26.616: WARN/IInputConnectionWrapper(97): showStatusIcon on inactive InputConnection 
+0

日志猫的任何错误? – Flo

+0

添加了Logcar读取项目的全面运行 – Ian

回答

1

试试这个..

公共类MyAsyncTask延伸活动{

public static TextView timer; 
private MyTimer asyncTask; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    asyncTask = (MyTimer) new MyTimer().execute(); 
    timer = (TextView) findViewById(R.id.text); 

} 

public class MyTimer extends AsyncTask<String, Object, String> { 

    Timer _timerTask = new Timer(); 
    int totalSeconds = 1; 
    int hour = 0; 
    int min = 0; 
    int sec = 0; 
    final String mTimeFormat = "%02d:%02d:%02d"; 
    String timeTakenString; 
    private String timeTaken; 
    @Override 
    protected String doInBackground(String... params) { 

     TimerTask timer = new TimerTask() { 
      @Override 
      public void run() { 

       MyAsyncTask.printscreen(); 
       totalSeconds += 1; 
       sec += 1; 
       if (sec >= 60) { 
        sec = 0; 
        min += 1; 
        if (min >= 60) { 
         min = 0; 
         hour += 1; 
        } 
       } 
       timeTakenString = String 
         .format(mTimeFormat, hour, min, sec); 
       onPostExecute(timeTakenString); 

      } 
     }; 
     (_timerTask).scheduleAtFixedRate(timer, 1000, 1000); 
     return timeTakenString; 

    } 

    protected void onPostExecute(String timeTaken) { 
     this.timeTaken = timeTaken; 
     Message message = new Message(); 
     message.what = 100; 
     mHandler.sendMessage(message); 
    } 

    Handler mHandler = new Handler() { 


     public void handleMessage(Message msg) { 
      if (msg.what == 100) { 

       timer.setText("Time Taken: " + timeTaken); 
      } 
     }; 
    }; 
} 

protected static void printscreen() { 
    // TODO Auto-generated method stub 

} 

}

+0

我很高兴能够通过一些小的更改来适应我的程序,谢谢! – Ian

1

你在一个线程启动线程(定时器是一个线程),这是一个问题。 我看到你需要可重复的代码。为什么不使用没有AsyncTask的Timer?它是独立的线程,它不会挂起UI。当然,您需要Handler对象来更新任何UI,因为您无法从另一个UI UI更新UI,而不是UI线程。 像这样的东西应该工作:

Timer _timerTask = new Timer(); 
    TimerTask timer = new TimerTask() { 
     @Override 
     public void run() { 
      postExecute.sendEmptyMessage(0); //first UI update    
      totalSeconds += 1; 
      sec += 1; 
      if(sec >= 60) { 
       sec = 0; 
       min += 1; 
       if (min >= 60) { 
        min = 0; 
        hour += 1; 
       } 
      } 
      timeTakenString = String.format(mTimeFormat, hour, min, sec); 
      postExecute.sendEmptyMessage(1); //second UI update 
     } 
     private Handler postExecute = new Handler(){ 
      @Override 
      public void dispatchMessage(Message msg) { 
       super.dispatchMessage(msg); 
       if(msg.what == 0) 
        GPSMain.printscreen(); 
       else if(msg.what == 1) 
        GPSMain.timer.setText("Time Taken: "+timeTaken); 
      } 
     }; 
    }; 
    _timerTask.scheduleAtFixedRate(timer,1000,1000); 
+0

我试过这段代码,它现在正在执行“run()”方法。我有一个吐司消息,只是行“TimerTask计时器=新的TimerTask(){”它不会显示,另一个作为“run()”方法的第一行代码。 – Ian

+0

@lan你不能在单独的线程中更新UI(Toast是UI更新)。你必须在UI线程中做到这一点。 – Olsavage

1

您可以使用onProgressUpdate背景中的TextView的变化文本..

@Override 
     protected void onProgressUpdate(String... values) 
     { 
      GPSMain.timer.setText("Time Taken: "+values[0]); 
      super.onProgressUpdate(values); 
     } 

doinBackground方法叫这个publishProgress(timeTakenString)

有关的AsyncTask更详细然后click here