为什么异步任务不工作? String-json\u字符串; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 公共void getJSON(视图){ 新建BackgroundTask().execute(); } 类BackgroundTask扩展了AsyncTask{ 字符串json_url; @凌驾 受保护的void onPreExecute(){ json_url=”http://androidtut.comli.com/json_get_data.php"; } @凌驾 受保护的空位背景(空位…空位){ 试一试{ URL=新URL(json_URL); HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection(); InputStream InputStream=httpURLConnection.getInputStream(); BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream)); StringBuilder StringBuilder=新的StringBuilder(); 而((json_string=bufferedReader.readLine())!=null){ 追加(json_字符串+“\n”); } bufferedReader.close(); inputStream.close(); httpURLConnection.disconnect(); 返回stringBuilder.toString().trim(); } 捕获(格式错误){ e、 printStackTrace(); } 捕获(IOE异常){ e、 printStackTrace(); } 返回null; } @凌驾 受保护的void onProgressUpdate(void…值){ super.onProgressUpdate(值); } @凌驾 受保护的void onPostExecute(字符串结果){ TextView TextView=(TextView)findViewById(R.id.textJSON); setText(结果); } }
错误:(31,5)错误:MainActivity.BackgroundTask不是抽象的,并且不重写AsyncTask中的抽象方法doInBackground(Void…) 错误:(39,24)错误:MainActivity中的doInBackground(Void…)。BackgroundTask无法覆盖AsyncTask中的doInBackground(Params…) 返回类型Void与字符串不兼容 其中,Params、Result是类型变量: Params扩展类AsyncTask中声明的对象 结果扩展了类AsyncTask中声明的对象 错误:(38,9)错误:方法不重写或实现超类型中的方法 错误:(54,53)错误:不兼容的类型:无法将字符串转换为Void 错误:任务“:app:compiledBugJavaWithJavaC.”的执行失败>编译失败;有关详细信息,请参阅编译器错误输出。为什么异步任务不工作? String-json\u字符串; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 公共void getJSON(视图){ 新建BackgroundTask().execute(); } 类BackgroundTask扩展了AsyncTask{ 字符串json_url; @凌驾 受保护的void onPreExecute(){ json_url=”http://androidtut.comli.com/json_get_data.php"; } @凌驾 受保护的空位背景(空位…空位){ 试一试{ URL=新URL(json_URL); HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection(); InputStream InputStream=httpURLConnection.getInputStream(); BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream)); StringBuilder StringBuilder=新的StringBuilder(); 而((json_string=bufferedReader.readLine())!=null){ 追加(json_字符串+“\n”); } bufferedReader.close(); inputStream.close(); httpURLConnection.disconnect(); 返回stringBuilder.toString().trim(); } 捕获(格式错误){ e、 printStackTrace(); } 捕获(IOE异常){ e、 printStackTrace(); } 返回null; } @凌驾 受保护的void onProgressUpdate(void…值){ super.onProgressUpdate(值); } @凌驾 受保护的void onPostExecute(字符串结果){ TextView TextView=(TextView)findViewById(R.id.textJSON); setText(结果); } },android,android-asynctask,Android,Android Asynctask,错误:(31,5)错误:MainActivity.BackgroundTask不是抽象的,并且不重写AsyncTask中的抽象方法doInBackground(Void…) 错误:(39,24)错误:MainActivity中的doInBackground(Void…)。BackgroundTask无法覆盖AsyncTask中的doInBackground(Params…) 返回类型Void与字符串不兼容 其中,Params、Result是类型变量: Params扩展类AsyncTask中声明的
AsyncTask
这里的最后一个类型是返回结果类型
您的doInBackground
当前定义为Void
,而不是String
同样,不能将StringBuilder
字符串结果作为Void
类型返回
您可能会发现,处理JSON更容易使用 好的,当您在AsyncTask中定义Void时,您应该理解其含义
如果您不能清楚地理解AsyncTask中的函数,最好尝试在AndroidStudio中生成该函数。 以下是AndroidStudio生成的代码
String json_string;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void getJSON (View view){
new AsynsTask(){
String json_url;
@Override
protected void onPreExecute() {
json_url = "http://androidtut.comli.com/json_get_data.php";
}
@Override
protected Void doInBackground(Void... voids) {
try {
URL url = new URL(json_url);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((json_string = bufferedReader.readLine()) != null) {
stringBuilder.append(json_string + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
}
catch (MalformedURLException e){
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
TextView textView = (TextView) findViewById(R.id.textJSON);
textView.setText(result);
}
}.execute();
}
class BackgroundTask扩展了AsyncTask
{
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
}
@凌驾
受保护的void onProgressUpdate(void…值){
super.onProgressUpdate(值);
}
@凌驾
受保护字符串doInBackground(无效…参数){
返回null;
}
}
将您的代码与上面的代码进行比较,我想您会知道答案。我在这里发现了两个错误。
1.对于任务执行,
class BackgroundTask extends AsyncTask<Void,Void,String>
{
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(Void... params) {
return null;
}
}
2.doInBackground返回类型应与结果类型(即字符串)匹配
String-json\u字符串;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
公共void getJSON(视图){
new BackgroundTask().execute(空);
}
类BackgroundTask扩展了AsyncTask{
字符串json_url;
@凌驾
受保护的void onPreExecute(){
json_url=”http://androidtut.comli.com/json_get_data.php";
}
@凌驾
受保护的字符串背景(无效…无效){
试一试{
URL=新URL(json_URL);
HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection();
InputStream InputStream=httpURLConnection.getInputStream();
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream));
StringBuilder StringBuilder=新的StringBuilder();
而((json_string=bufferedReader.readLine())!=null){
追加(json_字符串+“\n”);
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
返回stringBuilder.toString().trim();
}
捕获(格式错误){
e、 printStackTrace();
}
捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
super.onProgressUpdate(值);
}
@凌驾
受保护的void onPostExecute(字符串结果){
TextView TextView=(TextView)findViewById(R.id.textJSON);
文本视图
class BackgroundTask extends AsyncTask<Void,Void,String>
{
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(Void... params) {
return null;
}
}
new BackgroundTask().execute(null);
protected String doInBackground(Void... voids)
String json_string;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void getJSON (View view){
new BackgroundTask().execute(null);
}
class BackgroundTask extends AsyncTask <Void, Void, String>{
String json_url;
@Override
protected void onPreExecute() {
json_url = "http://androidtut.comli.com/json_get_data.php";
}
@Override
protected String doInBackground(Void... voids) {
try {
URL url = new URL(json_url);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while ((json_string = bufferedReader.readLine()) != null) {
stringBuilder.append(json_string + "\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return stringBuilder.toString().trim();
}
catch (MalformedURLException e){
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
TextView textView = (TextView) findViewById(R.id.textJSON);
textView.setText(result);
}
}