2014-01-25 258 views
0

嘿,我有一個問題,我的android應用程序。我試圖從給定的URL下載文本到可編輯框,但是當我運行應用程序,並擊中按鈕它突然停止working.I使用asynctask下載,還蝕告訴我,類DownloadTask不當地使用異步任務不工作

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

如果這有助於分鐘API爲10,目標16 歡呼傢伙

+0

嘗試DownloadTask()執行((無效)爲空)。 –

+0

由於不會在主(ui)線程中執行,因此您不能在後臺使用UI代碼。 tv.setText(標題); 同樣對於將來的問題,請包括來自LogCat的StackTrace,我相信它會拋出一個異常,清楚地表明您嘗試在非UI線程上運行UI代碼。 –

回答

1

您無法在doInBackground中運行UI代碼。

您嘗試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

:(現在,我們可以談論主題。 hmm ...

您正在使用AsyncTask從url下載文本。

這意味着你正在使用另一個線程來做。

而另一個線程無法更改用戶界面。您必須在主線程中更改UI。但是如果你想改變其他線程的UI,你可以使用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. 
    } 
}