异步任务无法正常工作

时间:2014-01-25 12:58:09

标签: java android eclipse jsoup

嘿,我的Android应用程序有问题。我试图将文本从给定的网址下载到可编辑框但是当我正在运行应用程序并按下按钮时它突然停止工作。我正在使用asynctask要下载,eclipse也告诉我,类本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);

如果这有助于min api为10,则目标为16 欢呼的家伙

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

:(现在,我们可以谈谈Thread。 嗯...

您正在使用AsyncTask从网址下载文字。

这意味着你正在使用另一个线程来做。

另一个线程无法更改UI。您必须在主线程中更改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.
     }
}
相关问题