2014-01-25 2 views
0

Привет, у меня проблема с моим андроидным приложением. Я пытаюсь загрузить текст с заданного url в Редактируемый блок, но когда я запускаю приложение и нажимаю кнопку, он внезапно перестает работать. Я использую asynctask скачать, также затмение говорит мне, что класс DownloadTask не используется локальноЗадача Async не работает

public void sendMessage(View view) throws IOException { 
    new DownloadTask().execute(); 
} 

private class DownloadTask extends AsyncTask{ 
    protected Object doInBackground(Object... params) { 
     // TODO Auto-generated method stub 
     try { 
      EditText tf = (EditText) findViewById(R.id.editText1); 
      String kupa = tf.getText().toString(); 
      Document doc; 
      doc = Jsoup.connect(kupa).get(); 
      String title = doc.text(); 
      TextView tv = (TextView) findViewById(R.id.textView1); 
      tv.setText(title); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    protected void onPostExecute(String result) { 
     TextView tv = (TextView) findViewById(R.id.textView1); 
     tv.setText(result); 
    } 





} 

также я добавил две строки кода в мой OnCreate метод

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

Если это помогает мин АФИ 10, цель 16 cheers guys

+0

попробовать DownloadTask() выполнить ((Пустота) нуль). –

+0

У вас не может быть код пользовательского интерфейса в фоновом режиме, поскольку он не выполняется с помощью основного (ui) потока. tv.setText (название); Также для будущих вопросов, пожалуйста, включите StackTrace из LogCat, я уверен, что это вызовет исключение, ясно указывающее, что вы пытались запустить код пользовательского интерфейса в потоке, отличном от ui. –

ответ

1

вы не можете запустить код пользовательского интерфейса в doInBackground.

вы пытаетесь запустить сильфон кода на doInBackground, удали это или переместить его в onPostExecute

tv.setText(title); 

и вам не нужен следующая строка:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

, если вам нужно значение в AyncTask вы можете если вам нужно tf.getText().toString(), вы можете изменить свой код следующим кодом:

new DownloadTask().execute(tf.getText().toString()); 

и изменить AsyncTask класс с:

public static class DownloadTask extends AsyncTask<String, Void, Void> 
{ 
    @Override 
    protected Void doInBackground(String... params) 
    // use params array, in this example you can get tf.getText().toString() with params[0] 
     String kupa = params[0] // if you pass more data you can increase index 
} 

для получения дополнительной информации см documentation of AsyncTask

0

:(Теперь мы можем говорить о Thread. hmm ...

Вы используете AsyncTask для загрузки текста с URL-адреса.

Это значит, что вы используете другой поток.

И еще один нить не может изменить интерфейс. Вы должны изменить интерфейс в основной теме. Но если вы хотите изменить пользовательский интерфейс в другом потоке, вы можете использовать метод runOnUIThread.

Я могу дать вам решение проблемы.

Ребенок AsyncTask

public class AsyncLoadData extends AsyncTask<String, Void, String> { 
    private Context mContext; 
    private ILoadDataListener mListener; 

    public AsyncLoadData(Context context, ILoadDataListener listener) { 
     this.mContext = context; 
     this.mListener = listener; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
       String url = params[0]; 
     String result = doGetStringFromUrl(url); // You can write your own method; 
       return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     mListener.complete(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     mListener.loading(); 
    } 

    public interface ILoadDataListener { 
     void loading(); 

     void complete(String result); 
    } 
} 

В вашей деятельности

public class MainActivity extends Activity implements AsyncLoadData.ILoadDataListener { 
     /// Something... 
    public void getData() { 
     new AsyncLoadData(this, this).execute(url); 
     // or new AsyncLoadData(getBaseContext(), this).execute(url); 
    } 

    @Override 
    public void loading() { 
     // Do something here when you start download and downloading text 
    } 

    @Override 
    public void complete(String result) { 
     TextView mTextView = (TextView) findViewById(R.id.your_text_view); 
     mTextView.setText(result); 
     // EditText is the same. 
    } 
} 
Смежные вопросы