为了账号安全,请及时绑定邮箱和手机立即绑定

AsyncTask 运行不正确

AsyncTask 运行不正确

catspeake 2021-09-26 16:40:26
我对 AsyncTask 在某一时刻运行但不是下一时刻有一些故障。我已经尽可能地简化了代码。下面的 try/catch 代码在应用程序启动时从 MainActivity 调用时启动我的异步任务。但是,当我将此完全相同的代码放入同一类文件中的按钮时,classCastException 错误会使应用程序崩溃。我对异步有什么不了解的地方吗?谢谢大家。调用异步的代码:findViewById(R.id.errorbtn).setOnClickListener( new View.OnClickListener() {    @Override    public void onClick(View v) {try {    new MainActivity.MyTask().execute(this);}catch (Exception e) {    e.printStackTrace();}}});异步任务:private class MyTask extends AsyncTask<Object, Void, String> {MainActivity activity;@Overrideprotected String doInBackground(Object... params) {    activity = (MainActivity)params[0];    try {        StringBuilder sb = new StringBuilder();        URL url = new URL("https://www.example.com");        BufferedReader in;        in = new BufferedReader(new InputStreamReader(url.openStream()));        String inputLine;        while ((inputLine = in.readLine()) != null)        sb.append(inputLine);        in.close();        html = sb.toString();    }    catch (Exception e) {        e.printStackTrace();    }    // SOME WORK IS DONE USING HTML VARIABLE & URL DATA...}    @Override    protected void onPostExecute(String str) {        // RESULT IS LOADED INTO LIST VIEW...    }}
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

问题是您正在使用对 View.OnClickListener() 的引用创建 AsyncTask。

将创建行修改为:

new MainActivity.MyTask().execute(MainActivity.this);

它应该工作。

原因很简单:该行位于 OnClickListener 内,因此“this”指的是 Listener,而不是 Activity。通过限定 AsyncTask,您可以更具表现力,如下所示:

AsyncTask<MainActivity, Void, String>


查看完整回答
反对 回复 2021-09-26
  • 2 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信