【发布时间】:2011-09-07 20:53:11
【问题描述】:
显示的代码使用 AsyncTask 类来调用阻塞进程,这样 UI 就不会被阻塞,并且会显示一个进度条。有趣的是 onClick 方法有效,但 KeyCode 方法无效。请问有什么建议吗?
// inside the onCreate method of the activity
.....
ttsymbol.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (keyCode)
{
case KeyEvent.KEYCODE_ENTER:
setProgressBarIndeterminateVisibility(true);
new myBGtask().execute(ttsymbol.getText().toString().trim());
return true;
}
return false;
}
}
);
mainPanel.addView(ttsymbol);
//GetData button
final Button btnGetData = new Button(this);
// configure the button adding onClick method
btnGetData.setText("Get Pivot Point");
btnGetData.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
btnGetData.setGravity(Gravity.CENTER);
btnGetData.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
setProgressBarIndeterminateVisibility(true);
new myBGtask().execute(ttsymbol.getText().toString().trim());
}
});
mainPanel.addView(btnGetData);
.....
private class myBGtask extends AsyncTask {
private String spage;
protected Long doInBackground(String... URL) {
String starget;
try {
starget = URL[0];
spage = CustomHttpClient.myHttpGet(starget);
} catch (Exception e) {
Toast.makeText(getBaseContext(), "failed to GET webpage", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
return (long) 0;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
String sresults;
setProgressBarIndeterminateVisibility(false);
sresults = scrape(spage);
if (sresults.length() == 0 )
{
lblDATE.setTextColor( Color.BLACK);
lblDATE.setText( "cannot find that!");
return;
}
String s[] = sresults.split("\n");
lblDATE.setText(s[0]);
.....
}
}
错误信息:
09-07 20:10:32.554: ERROR/AndroidRuntime(334): FATAL EXCEPTION: AsyncTask #1
09-07 20:10:32.554: ERROR/AndroidRuntime(334): java.lang.RuntimeException: An error occured while executing doInBackground()
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at android.os.AsyncTask$3.done(AsyncTask.java:200)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.lang.Thread.run(Thread.java:1019)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at android.os.Handler.(Handler.java:121)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at android.widget.Toast.(Toast.java:68)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at android.widget.Toast.makeText(Toast.java:231)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at com.chrisdev.geturltry1.Chrisgeturltry1Activity$myBGtask.doInBackground(Chrisgeturltry1Activity.java:204)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at com.chrisdev.geturltry1.Chrisgeturltry1Activity$myBGtask.doInBackground(Chrisgeturltry1Activity.java:1)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
09-07 20:10:32.554: ERROR/AndroidRuntime(334): ... 4 more
09-07 20:10:32.619: WARN/ActivityManager(69): Force finishing activity com.chrisdev.geturltry1/.Chrisgeturltry1Activity
【问题讨论】:
-
究竟是什么不起作用?和
looper.prepare()有什么关系? -
抱歉忘记了错误信息!
-
删除吐司后贴出错误信息。