2016-01-20 22 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