嘿,我的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 欢呼的家伙
答案 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.
}
}