【问题标题】:finish() is not executed in AsyncTask在 AsyncTask 中未执行 finish()
【发布时间】:2016-01-20 15:51:13
【问题描述】:

我正在实现一个名为 MyAdapter 的类,它扩展了 BaseAdapter。在 myAdapter 类中,我正在实现一个名为 AttemptLike 的类,它扩展了 AsyncTask。在类 AttemptLike while Implementind doInBackground 函数中,我无法使用 finish();因此,每当我调用 Attemptlike 类时,我的应用程序都会崩溃。所以请告诉我如何处理错误。

代码是这样的

 class MyAdapter extends BaseAdapter{
 .
 .
 .
  public class Attemptlike extends AsyncTask<String, String, String>{
  {
  protected String doInBackground(String... args) 
  {
  try 
                { 
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("somedata1", field1)); 
                    params.add(new BasicNameValuePair("somedata2", field2));
 params.add(new BasicNameValuePair("geteventdata", evnt));
                    Log.d("request!", "starting"); 
                    JSONObject json = jsonParser.makeHttpRequest( LOGIN_URL, "POST", params);
                    // checking log for json response 
                    Log.d("Login attempt", json.toString()); 
                    // success tag for json 
                    success = json.getInt(TAG_SUCCESS); 
                    if (success == 1) 
                    { 
                        Log.d("Successfully Liked!", json.toString());

                        finish();
                        // this finish() method is what i am not able use which is resulting in crashing of app
                    }  
                catch (JSONException e) 
                { 
                    e.printStackTrace();
                } 
                return null; 
                }  

        }

        new AttemptLogin().execute();
   return convertView;
   }

 }

堆栈跟踪

FATAL EXCEPTION: AsyncTask #1
Process: ks.developers.festo, PID: 29568
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at      java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at  java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method     'java.lang.String org.json.JSONObject.toString()' on a null object reference
at ks.developers.festo.list.adapter.MyAdapter$2$1AttemptLike.doInBackground(MyAdapter.java:237)
at ks.developers.festo.list.adapter.MyAdapter$2$1AttemptLike.doInBackground(MyAdapter.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4 more

【问题讨论】:

  • finish() 不是 AsyncTask... 或 BaseAdapter 上的方法。你想做什么?
  • finish 是为了活动,所以如果你想从异步任务中关闭调用活动,请检查this answer
  • 我已将堆栈跟踪粘贴到此处,请看一下。
  • 在此站点中搜索“如何读取堆栈跟踪”。

标签: android android-asynctask baseadapter


【解决方案1】:

您不能在AsyncTask 中使用这样的完成。它是activity的成员方法。

您可能想尝试将其放入 runOnUiThread() 或将比赛传递给 AsyncTask 并使用上下文调用 finish()

没有亲自尝试过,但我打赌第一个可以工作。

查看您现在粘贴的堆栈跟踪后更新:

你实际上在这一行有一个 NPE:

Log.d("Login attempt", json.toString()); 

json 为空,因此您根本无法获取数据。它永远不会到达finish(),因为当您尝试记录 json 时,NPE 在toString() 调用中被抛出很多。首先修复它,看看它是否有效。如果还是不行,请尝试上述方法之一。

【讨论】:

  • 我已经把堆栈跟踪贴在这里了,看看吧
  • 实际上我再次尝试了相同的工作,它的工作良好。一段时间后它不能正常工作并且正在崩溃。
  • 不明白上面的评论。你能解释一下什么有效,然后又停止工作,你做了什么改变使它暂时有效?
  • 我没有改变任何东西,我只是重新安装了应用程序并尝试了 agian。它第一次运行良好,后来开始崩溃。
  • 删除log.d 并在使用前对json 进行空检查。
【解决方案2】:

将您的结果传递给 asynctask#onpostexecute 并从那里调用完成。 Finish 与 ui 线程交互,并且必须从该线程调用。您的 asynctask 在另一个线程上执行。在调用线程上执行后执行,因此完成将起作用。

【讨论】:

  • 我已经把堆栈跟踪贴在这里了,看看吧
  • 我已经阅读并尝试过,但没有解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多