下载任务抛出异常,没有互联网

时间:2016-09-05 04:41:39

标签: java android android-studio exception

我有一个从互联网上下载当前unix时间戳的应用程序。下载任务的代码如下。

public class DownloadTask extends AsyncTask<String, Void, String> {


        @Override
        protected String doInBackground(String... urls) {

            String result = "";
            URL url;
            HttpURLConnection urlConnection = null;

            try {

                url = new URL(urls[0]);

                urlConnection = (HttpURLConnection) url.openConnection();

                InputStream in = urlConnection.getInputStream();

                InputStreamReader reader = new InputStreamReader(in);

                int data = reader.read();

                while (data != -1) {

                    char current = (char) data;

                    result += current;

                    data = reader.read();
                }

                return result;

            } catch (Exception e) {

                e.printStackTrace();
                Toast.makeText(SplashActivity.this, "you aint got no internet man", Toast.LENGTH_SHORT).show();

            }

            return null;
        }

我在onCreate

中运行此代码
DownloadTask task = new DownloadTask();
        String result = null;

        try {

            result = task.execute("http://www.currenttimestamp.com/").get();

            Pattern p = Pattern.compile("current_time = (.*?);");
            Matcher m = p.matcher(result);
            m.find();
            String unixTime = (m.group(1));
            timeStamp = Integer.parseInt(unixTime);
            endTimeMaths = endTime/1000;

        } catch (InterruptedException e) {

            e.printStackTrace();
            Toast.makeText(SplashActivity.this, "you aint got no internet man", Toast.LENGTH_SHORT).show();

        } catch (ExecutionException e) {

            e.printStackTrace();
            Toast.makeText(SplashActivity.this, "you aint got no internet man", Toast.LENGTH_SHORT).show();

        }

        timeDelta = timeStamp-endTimeMaths;

        Log.i("TimeDelta", timeDelta+"");


        //If dem boys cheatin
        if (timeDelta < 1){
            Toast.makeText(SplashActivity.this, "You cheatin boi?", Toast.LENGTH_SHORT).show();
            reward=false;
        } else if (timeDelta >= 300){
            reward = true;
            Toast.makeText(SplashActivity.this, "Here is your reward for being gone", Toast.LENGTH_SHORT).show();
        }

    }

例外情况如下

09-04 21:26:42.853 8459-8493/com.firefluxentertainment.retroclicker         E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
        Process: com.firefluxentertainment.retroclicker, PID: 8459
        java.lang.RuntimeException: An error occurred while executing     doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:318)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:761)
        Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
        at android.os.Handler.<init>(Handler.java:200)
        at android.os.Handler.<init>(Handler.java:114)
        at android.widget.Toast$TN.<init>(Toast.java:346)
        at android.widget.Toast.<init>(Toast.java:101)
        at android.widget.Toast.makeText(Toast.java:260)
        at com.firefluxentertainment.retroclicker.SplashActivity$DownloadTask.doInBackground(SplashActivity.java:155)
        at com.firefluxentertainment.retroclicker.SplashActivity$DownloadTask.doInBackground(SplashActivity.java:119)
        at android.os.AsyncTask$2.call(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
        at java.lang.Thread.run(Thread.java:761)

由于所有代码都在try catch括号中,我不知道它为什么会崩溃。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

这是因为您试图在while True: age = input("What is your age?\nEnter 'quit' to exit: ") try: age = int(age) if age < 3: print("Your ticket is free.") elif 3 <= age <=12: print("Your ticket is $10.") elif 12 < age: print("Your ticket is $15.") else: print("Please enter a valid age.") except ValueError: if age.lower() == 'quit': break 中展示吐司。您的问题有多种解决方案:

  • 在Activity中创建一个处理程序并将其传递给non-UI thread。只需在DownloadTask中发送消息并显示祝酒词。

  • 另一种解决方案是在Handler中发送上下文并将吐司显示为

    DownloadTask
  • 您可以在 context.runOnUIThread(new Runnable() { public void run(){ Toast.showToast("your message here") } ) 中发送任务结果并在那里显示Toast。

相关问题