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