gpt4 book ai didi

android - 异步任务和监听器

转载 作者:太空狗 更新时间:2023-10-29 12:47:51 25 4
gpt4 key购买 nike

我有一个应用程序可以进行大量 RESTful 服务调用。我在扩展 Asynctask 的类中执行调用。如果我必须取消异步任务,我也想取消服务调用。不幸的是,取消异步操作仍然允许 doInBackground 完成,并且一旦请求正在等待响应(这可能需要一点时间)我就无法调用 isCancelled() 。现在,我正在从我的 doInBackground 方法中注册,以便在发出取消请求时收到 UI 线程的通知,因此我可以中止 HttpResponse 对象。这是一段示例代码。

到目前为止它一直有效,但我真的可以指望它,还是我只是走运?你能指望一个线程调用另一个线程中的方法吗?

public class AsyncTestActivity extends Activity {

private ArrayList<IStopRequestMonitor> monitors;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
}

public void stopActivity() {
if (monitors == null || monitors.size() < 1) return;

for (int i = 0; i < monitors.size(); i++) {
monitors.get(i).stopRequest();
}
}

public void addListener(IStopRequestMonitor listener) {
if (monitors == null) monitors = new ArrayList<IStopRequestMonitor>();
monitors.add(listener);
}

public void readWebpage(View view) {
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute(new String[] { "http://www.mywebsite.com/feeds/rsstest.xml" });
}

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
DefaultHttpClient client = new DefaultHttpClient();
final HttpGet httpGet = new HttpGet(urls[0]);

addListener(new IStopRequestMonitor() {

public void stopRequest() {
if (httpGet == null) return;
httpGet.abort();
cancel(true);
}
});

try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();

// handle inputstream
} catch (Exception e) {
e.printStackTrace();
}
return "";
}

@Override
protected void onPostExecute(String result) {
Log.d("Result:", result);
}
}

interface IStopRequestMonitor {
public void stopRequest();
}
}

最佳答案

这里还有一场比赛。如果 stopActivity() 在后台线程调用 addListener() 之前运行,则监听器将在稍后添加并且永远不会被调用以中止 HttpGet。

如果您要从 UI 线程(或您在其上创建 AsyncTask 的任何线程)调用 cancel(),您可以:

  1. 在您的 AsyncTask 中创建一个“私有(private) HttpGet httpGet”字段。
  2. 覆盖 onPreExecute() 并在那里初始化 httpGet。
  3. 覆盖 onCancel() 并说“if (httpGet != null) { httpGet.abort() }”
  4. 在doInBackground()中,如果isCancelled()立即返回,否则运行。

因为这会在 UI 线程上初始化 httpGet,cancel() 调用将在 execute() 之前运行(因此 doInBackground 将看到 isCancelled() 返回 true),或者它将在 httpGet 存在之后运行,因此 HttpGet 将是中止。

除非您将其用于其他用途,否则您不需要监听器。

关于android - 异步任务和监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16096908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com