2013-10-01 5 views
0

Сбой приложения для Android, когда я пытаюсь загрузить страницу, я дал разрешение на подключение к Интернету и читал/записывал внешнее хранилище, я пытаюсь создать простое приложение с двумя параметрами URL-адрес скачать и местоположение для сохранения страницы, но когда я нажму кнопку загрузки, приложение выйдет из строя.сбои приложений для Android при загрузке страницы

Какое приложение вызывает сбой? Каков правильный способ загрузки URL-адреса?

package com.downloadfile; 

import android.app.*; 
import android.content.*; 
import android.os.*; 
import android.view.*; 
import android.widget.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 

public class MainActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
    public void saveButton(View v) throws MalformedURLException, IOException 
    { 
     EditText pageurl = (EditText) findViewById(R.id.page_url); 
     String PageUrl = pageurl.getText().toString(); 
     EditText filePath = (EditText) findViewById(R.id.save_path); 
     String FilePath = filePath.getText().toString(); 

     if (FilePath.startsWith("/")) 
     { 

      URL url = new URL(PageUrl); 

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

      InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 

      String data = new java.util.Scanner(in).useDelimiter("\\A").next(); 
      PrintWriter writer = new PrintWriter(FilePath, "UTF-8"); 
      writer.println(data); 
      writer.close(); 
      urlConnection.disconnect(); 


      Context context = getApplicationContext(); 
      CharSequence text = FilePath; 
      int duration = Toast.LENGTH_SHORT; 
      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 
     } 
     else 
     { 
      Context context = getApplicationContext(); 
      CharSequence text = "Please enter file path"; 
      int duration = Toast.LENGTH_SHORT; 
      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 
     } 
    } 
} 

Вот мой файл макета

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:minWidth="300dp" 
    android:padding="5dp"> 

    <EditText 
     android:id="@+id/page_url" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:hint="url" 
     android:inputType="textUri"/> 

    <EditText 
     android:id="@+id/save_path" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:hint="save path" 
     android:inputType="textUri"/> 

    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:id="@+id/linearLayout1" 
     android:layout_marginTop="4dp"/> 

    <Button 
     android:id="@+id/download" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:text="Download" 
     android:onClick="saveButton"/> 

</LinearLayout> 
+0

Вам нужно сделать запрос работать в фоновом потоке. Скорее всего, это проблема. – cYrixmorten

+0

Для сбоев посмотрите на logcat для исключения stacktrace. Включите его в вопрос. – laalto

ответ

1

Вы работаете, связанные с сетевой операции на поток пользовательского интерфейса. Используйте Thread или Asynctask.

Возможно, вы получаете NetWorkOnMainThreadException. http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

Переместите инициализацию просмотров в onCreate. На кнопке нажмите кнопку Получить текст из Edittext. Нет необходимости инициализировать каждый раз при нажатии кнопки.

EditText pageurl; 
EditText filePath; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    pageurl = (EditText) findViewById(R.id.page_url); 
    filePath = (EditText) findViewById(R.id.save_path); 
} 

http://developer.android.com/reference/android/os/AsyncTask.html

на кнопке мыши

public void saveButton(View v) 
    { 
     String PageUrl = pageurl.getText().toString(); 
     String FilePath = filePath.getText().toString(); 
     new DownloadTask().execute(PageURl,FilePath); 
    } 

AsyncTask

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

@Override 
protected void onPostExecute(Void result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
} 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
} 

@Override 
protected Void doInBackground(String... params) { 
    // TODO Auto-generated method stub 
     if (params[1].startsWith("/")) 
     { 
     try 
     { 

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

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

     InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 

     String data = new java.util.Scanner(in).useDelimiter("\\A").next(); 
     PrintWriter writer = new PrintWriter(FilePath, "UTF-8"); 
     writer.println(data); 
     writer.close(); 
     urlConnection.disconnect(); 
     }catch(Exception e) 
     { 
      e.printstackTrace() 
     } 
     return null; 
} 

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