Android的活套。prepare() [英] Android looper.prepare()

查看:139
本文介绍了Android的活套。prepare()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

中显示的code使用的的AsyncTask类调用阻塞进程,使用户界面不堵塞,并且进度显示。有趣的是,该方法的onClick工作,但关键code方法不。有什么建议吗?

 
    //活动的onCreate方法内
    .....
        ttsymbol.setOnKeyListener(新OnKeyListener()
            {
                @覆盖
                公共布尔安其(视图V,INT键code,KeyEvent的事件){
                        开关(键code)
                        {
                        案例KeyEvent.KEY code_ENTER:
                            setProgressBarIndeterminateVisibility(真);
                            新myBGtask()执行(ttsymbol.getText()的toString()修剪());
                            返回true;
                        }
                        返回false;
                }
            }
        );
        mainPanel.addView(ttsymbol);        //的GetData按钮
        最终按钮btnGetData =新按钮(本);
        //配置按钮添加的onClick方法
        btnGetData.setText(获取支点);
        btnGetData.setLayoutParams(新的LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
        btnGetData.setGravity(Gravity.CENTER);
        btnGetData.setOnClickListener(新View.OnClickListener(){
            公共无效的onClick(查看视图){
                setProgressBarIndeterminateVisibility(真);
                新myBGtask()执行(ttsymbol.getText()的toString()修剪());
            }
        });
        mainPanel.addView(btnGetData);
    .....    私有类myBGtask扩展的AsyncTask {
    私人字符串S页面;
    保护龙doInBackground(字符串... URL){
        串starget;
      尝试{
          starget = URL [0];
          S页面= CustomHttpClient.myHttpGet(starget);
      }赶上(例外五){
          Toast.makeText(getBaseContext(),未能获得网页,Toast.LENGTH_SHORT).show();
          e.printStackTrace();
      }
      返回(长)0;
    }
    保护无效onProgressUpdate(整数...进度){    }
    保护无效onPostExecute(长效){
        串sresults;
        setProgressBarIndeterminateVisibility(假);
        sresults =刮(S页面);
        如果(sresults.length()== 0)
        {
            lblDATE.setTextColor(Color.BLACK);
            lblDATE.setText(找不到!);
            返回;
        }
        一个String [] = sresults.split(\\ n);        lblDATE.setText(S [0]);
        .....
    }
    }

错误信息:

 
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):致命异常:AsyncTask的#1
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):了java.lang.RuntimeException:执行doInBackground发生错误()
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在android.os.AsyncTask $ 3.done(AsyncTask.java:200)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:274)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.util.concurrent.FutureTask.setException(FutureTask.java:125)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:308)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.util.concurrent.FutureTask.run(FutureTask.java:138)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:581)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.lang.Thread.run(Thread.java:1019)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):了java.lang.RuntimeException:所致。不能内螺纹已不叫尺蠖prepare创造处理器()
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在android.os.Handler(Handler.java:121)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在android.widget.Toast(Toast.java:68)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在android.widget.Toast.makeText(Toast.java:231)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在com.chrisdev.geturltry1.Chrisgeturltry1Activity$myBGtask.doInBackground(Chrisgeturltry1Activity.java:204)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在com.chrisdev.geturltry1.Chrisgeturltry1Activity$myBGtask.doInBackground(Chrisgeturltry1Activity.java:1)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在android.os.AsyncTask $ 2.call(AsyncTask.java:185)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:306)
09-07 20:10:3​​2.554:ERROR / AndroidRuntime(334):... 4个
09-07 20:10:3​​2.619:WARN / ActivityManager(69):强制完成活动com.chrisdev.geturltry1 / .Chrisgeturltry1Activity


解决方案

您获得,因为 Toast.makeToast错误()从后台线程中调用。你不能做到这一点在 doInBackground(),而不是从该方法的返回值描述的异常,并显示在 onPostExecute)面包(如果你得到这个特定的值。

显然, code尝试块在一种情况下,但不是另一个失败。这是从不同的问题与活套。prepare()

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 in doInBackground() instead return value from this method describing exception and show toast in onPostExecute() if you get this specific value.

Apparently, code in try block fails in one case but not another. That's different from problem with looper.prepare().

这篇关于Android的活套。prepare()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆