2016-12-02 103 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

描述活動監視器中您的應用程序發生了什麼,添加崩潰日誌或嘗試通過使用調試器斷點爲您自己弄清楚這一點,以便您可以看到您的應用程序實際上從Web中獲取的內容,正確提取數據。 –

+0

[可惜MyApp已停止。如何解決這個問題?](http://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can-i-solve-this) –

回答

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

這種操作肯定調用NetworkOnMainThreadException。在手機中啓用嚴格模式會使此異常無法捕捉。這很好,因爲你可以遵循好的編程指導。關於它的更多信息here

名稱AsyncTask指定代碼的行爲 - 異步。在你的情況下,你同步執行它,你必須等待結果執行並通過委託傳遞給活動。

閱讀Android Developer文檔的Usage部分。

提示:在AsyncTask的onPostExecute方法內調用應該使用下載內容的代碼。

+0

對不起,我是一個初學者,你可以進一步解釋 –

相關問題