2016-12-02 3 views
0

Построено приложение, которое при открытии загружает контент с веб-сайта и заполняет изображение и кнопку текстом. Проверяют весь код, и у них нет ошибок, но когда приложение запускается на телефоне, он падает, когда приложение открывается с ошибкой приложения, которое перестает работать. Может ли кто-нибудь помочь?Ошибка приложения при попытке загрузить контент?

Xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 
- <GridLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentStart="true"> 
    <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_column="0" android:layout_row="0" android:layout_gravity="fill" android:id="@+id/imageView" /> 
    <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_row="1" android:layout_column="0" android:tag="0" android:text="" android:id="@+id/button" android:onClick="celebChosen" /> 
    <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_row="2" android:layout_column="0" android:tag="1" android:text="" android:id="@+id/button2" android:onClick="celebChosen" /> 
    <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_row="3" android:layout_column="0" android:tag="2" android:text="" android:id="@+id/button3" android:onClick="celebChosen" /> 
    <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_row="4" android:layout_column="0" android:tag="3" android:text="" android:id="@+id/button4" android:onClick="celebChosen" /> 
    </GridLayout> 
    </RelativeLayout> 

JAVA

package com.airrocketapps.matthillman.guessthecelebrity; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Random; 
import java.util.concurrent.ExecutionException; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class MainActivity extends Activity { 

    ArrayList<String> celebURLs = new ArrayList<String>(); 
    ArrayList<String> celebNames = new ArrayList<String>(); 
    int chosenCeleb = 0; 
    int locationOfCorrectAnswer = 0; 
    String[] answers = new String[4]; 

    ImageView imageView; 
    Button button0; 
    Button button1; 
    Button button2; 
    Button button3; 

    public void celebChosen(View view) { 

     if (view.getTag().toString().equals(Integer.toString(locationOfCorrectAnswer))) { 

      Toast.makeText(getApplicationContext(), "Correct!", Toast.LENGTH_LONG).show(); 

     } else { 

      Toast.makeText(getApplicationContext(), "Wrong! It was " + celebNames.get(chosenCeleb), Toast.LENGTH_LONG).show(); 

     } 

     createNewQuestion(); 

    } 

    public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 


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

      try { 

       URL url = new URL(urls[0]); 

       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

       connection.connect(); 

       InputStream inputStream = connection.getInputStream(); 

       Bitmap myBitmap = BitmapFactory.decodeStream(inputStream); 

       return myBitmap; 


      } catch (MalformedURLException e) { 

       e.printStackTrace(); 

      } catch (IOException e) { 

       e.printStackTrace(); 

      } 

      return null; 
     } 
    } 


    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(); 

      } 

      return null; 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     imageView = (ImageView) findViewById(R.id.imageView); 
     button0 = (Button) findViewById(R.id.button); 
     button1 = (Button) findViewById(R.id.button2); 
     button2 = (Button) findViewById(R.id.button3); 
     button3 = (Button) findViewById(R.id.button4); 

     DownloadTask task = new DownloadTask(); 
     String result = null; 

     try { 

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

      String[] splitResult = result.split("<div class=\"sidebarContainer\">"); 

      Pattern p = Pattern.compile("<img src=\"(.*?)\""); 
      Matcher m = p.matcher(splitResult[0]); 

      while (m.find()) { 

       celebURLs.add(m.group(1)); 

      } 

      p = Pattern.compile("alt=\"(.*?)\""); 
      m = p.matcher(splitResult[0]); 

      while (m.find()) { 

       celebNames.add(m.group(1)); 

      } 


     } catch (InterruptedException e) { 

      e.printStackTrace(); 

     } catch (ExecutionException e) { 

      e.printStackTrace(); 

     } 

     createNewQuestion(); 

    } 

    public void createNewQuestion() { 

     Random random = new Random(); 
     chosenCeleb = random.nextInt(celebURLs.size()); 

     ImageDownloader imageTask = new ImageDownloader(); 

     Bitmap celebImage; 

     try { 

      celebImage = imageTask.execute(celebURLs.get(chosenCeleb)).get(); 

      imageView.setImageBitmap(celebImage); 

      locationOfCorrectAnswer = random.nextInt(4); 

      int incorrectAnswerLocation; 

      for (int i=0; i<4; i++) { 

       if (i == locationOfCorrectAnswer) { 

        answers[i] = celebNames.get(chosenCeleb); 

       } else { 

        incorrectAnswerLocation = random.nextInt(celebURLs.size()); 

        while (incorrectAnswerLocation == chosenCeleb) { 

         incorrectAnswerLocation = random.nextInt(celebURLs.size()); 

        } 

        answers[i] = celebNames.get(incorrectAnswerLocation); 


       } 


      } 

      button0.setText(answers[0]); 
      button1.setText(answers[1]); 
      button2.setText(answers[2]); 
      button3.setText(answers[3]); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 




    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
+8

Пожалуйста, добавьте свои журналы –

+0

Опишите, что происходит с вашим приложением в Мониторе активности, добавьте журналы сбоев ИЛИ попробуйте сами выяснить, используя точки останова отладчика, чтобы вы могли видеть, что ваше приложение действительно вытащили из Интернета или оно хранит правильно извлеченные данные. –

+0

Возможный дубликат [К сожалению, MyApp остановлен. Как я могу это решить?] (Http://stackoverflow.com/questions/23353173/unappro-myapp-has-stopped-how-can-i-solve-this) –

ответ

1
imageTask.execute(celebURLs.get(chosenCeleb)).get() 

Эта операция, несомненно, вызывает NetworkOnMainThreadException. Строгий режим, разрешенный в телефоне, делает этот Исключительный файл несовместимым. Это хорошо, потому что вы следите за хорошими инструкциями по программированию. Подробнее об этом here

Имя AsyncTask указывает, как должен вести себя код - асинхронно. В вашем случае вы выполняете его синхронно, вам нужно ждать выполнения результата и передать его активности через делегат.

Прочитайте Usage раздел Документация разработчика для Android.

Подсказка: внутри onPostExecute метод AsyncTask вызывается код, который должен использовать загруженный контент.

+0

Извините, что я новичок, вы могли бы объяснить дальше –

Смежные вопросы