The code shown uses an AsyncTask class to call a blocking process so that the UI is not blocked, and a progressbar is shown. The funny thing is that the onClick method works, but the KeyCode method doesn’t. Any suggestions please?
// 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]);
.....
}
}
error messages:
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
You get an error because
Toast.makeToast()is called from background thread. You can’t do it indoInBackground()instead return value from this method describing exception and show toast inonPostExecute()if you get this specific value.Apparently, code in
tryblock fails in one case but not another. That’s different from problem withlooper.prepare().