2016-01-20 23 views
-1

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

的代码是这样

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 
+0

'finish()'不是'AsyncTask'或者'BaseAdapter'的方法。你想做什么? –

+0

完成是针对活动的,因此如果您想关闭asynctask中的调用活动,请选中[此答案](http://stackoverflow.com/a/12170947/562840)。 – Mikel

+0

我在这里粘贴堆栈跟踪只是看看它。 – Karrthik

回答

1

你不能在AsyncTask使用结束这样的。它是一种活动的成员方法。

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

没有亲自尝试,但我敢打赌,第一个工作。看着堆栈跟踪后

更新你现在粘贴:

实际上,你在这条线NPE:

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

JSON为空,所以你没有得到的数据在所有。它永远不会到达finish(),因为当您尝试登录json时,在调用toString()时NPE被抛出很多。首先解决这个问题,看看它是否有效。如果还没有,请尝试上述方法之一。

+0

我已经粘贴堆栈跟踪这里只是看看它 – Karrthik

+0

更新的答案。 – AndroidMechanic

+0

实际上我再次尝试了同样的工作,它的工作良好。过了一段时间,它不能很好地工作,并且正在坠毁。 – Karrthik

0

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

+0

我在这里粘贴堆栈跟踪只是看看它 – Karrthik

+0

看起来像@androidmechanic解决了它 – davehenry

+0

我已经读过它,并尝试过,但没有解决问题。 – Karrthik