2016-09-05 1 views
-1

Ich habe eine App, die den aktuellen Unix-Zeitstempel aus dem Internet herunterlädt. Der Code für die Download-Aufgabe lautet wie folgt.Download Aufgabe wirft Ausnahme ohne Internet

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; 
     } 

betreibe ich diesen Code in 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(); 
     } 

    } 

Die Ausnahme ist als

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) 

folgt Da der gesamte Code in Fang Klammern Versuch ist habe ich keine Ahnung warum es abstürzt werden . Jede Hilfe wird sehr geschätzt!

+2

Sie können nicht _Toast.makeText nennen (SplashActivity.this "Sie Aint kein Internet Mann bekam", Toast.LENGTH_SHORT) .show(); _ in _doInBackground_ Verfahren. U muss im UI-Thread angezeigt werden – Piyush

Antwort

2

Dies ist, weil Sie versuchen, Toast in einem non-UI thread anzuzeigen. Es gibt mehrere Lösungen für Ihr Problem:

  • einen Handler in der Aktivität erstellen und sie zusammen zu DownloadTask passieren. Senden Sie einfach eine Nachricht in Handler und zeigen Sie den Toast. es

  • Eine andere Lösung ist es, den Zusammenhang in DownloadTask und zeigen den Toast als

    context.runOnUIThread(new Runnable() { 
        public void run(){ 
         Toast.showToast("your message here") 
        } 
    ) 
    
  • senden können Sie das Ergebnis Ihrer Aufgabe in onPostExecute() und zeigen Toast senden.