我對 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條經驗 獲得超7個贊
問題是您正在使用對 View.OnClickListener() 的引用創建 AsyncTask。
將創建行修改為:
new MainActivity.MyTask().execute(MainActivity.this);
它應該工作。
原因很簡單:該行位于 OnClickListener 內,因此“this”指的是 Listener,而不是 Activity。通過限定 AsyncTask,您可以更具表現力,如下所示:
AsyncTask<MainActivity, Void, String>
添加回答
舉報
0/150
提交
取消