2012-05-31 3 views
1

У меня есть asynctask, которая - когда выполняется - отменяется сразу.AsyncTask отменен в конструкторе

Мой класс выглядит следующим образом:

public class JSONParser extends AsyncTask<String, Void, JSONArray> { 
    private ListFragment fragment; 
    @Override 
    protected JSONArray doInBackground(String... strings) { 
     JSONArray ja = null; 
     String string = ""; 
     try { 
      URL url = new URL(strings[0]); 
      BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); 
      string = br.readLine(); 

      ja = new JSONArray(string); 
     } catch (Exception e) { 
      Log.w("Special", e.toString()); 
     } 
     return ja; 
    } 

    public JSONParser(ListFragment fragment) { 
     this.fragment = fragment; 
    } 

    @Override 
    protected void onPostExecute(JSONArray jsonArray) { 
     try { 
     ArrayList<HashMap<String ,String>> datalist = new ArrayList<HashMap<String, String>>(); 

     int i = 0; 
     while (i < jsonArray.length()) { 
      HashMap<String, String> map = new HashMap<String, String>(); 
      JSONObject tool = jsonArray.getJSONObject(i); 

      map.put("id", tool.getInt("Id") + ""); 
      map.put("name", tool.getString("Name")); 
      datalist.add(map); 
      i++; 
     } 
     fragment.setListAdapter(new SimpleAdapter(fragment.getActivity(), datalist, R.layout.tools_list, new String[] {"name"}, new int[] {R.id.text})); 
     } catch (Exception e) { 
      e.getMessage(); 
     } 
    } 
} 

и из моего фрагмента я звоню его как этот

AsyncTask task = new JSONParser(this).execute("http://10.0.2.2:1288/webservice/gettools.aspx"); 

Использование отладчика я могу видеть, что как только вызывается конструктор, он переходит к onCancelled() и возвращается. URL-адрес действителен и работает, я не получаю сообщений в журнале, и JSON действителен.

Обновление: также у меня есть требуемое разрешение, и вызывается OnCancelled(), прежде чем он войдет в doInBackground(). doInBackground() никогда не вызывается.

Любые идеи?

Я использую IntelliJ и AVD с Android 4.0.3.

+0

может попробовать? BufferedReader r = новый BufferedReader (новый InputStreamReader (inputStream)); StringBuilder total = new StringBuilder(); Строка; while ((line = r.readLine())! = Null) { total.append (строка); } –

+0

вы можете установить точку отладки в строке = br.readLine(); при проверке потока reahig там или нет? –

+0

У меня есть. Я уточню вопрос. –

ответ

1

У вас установлены права доступа в Интернет в AndroidManifest? Вы уверены, что в doInBackground нет исключений?

Может быть, может быть, лучше также поставить время часть (я < jsonArray.length()) в doInBackground :) (для исполнения)

код для чтения строки:

BufferedReader reader = new BufferedReader(yourInputStreamReader,8); 

     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
+0

Разрешение есть. Я обновил вопрос. Спасибо за рекомендации по производительности :-) –

+0

Пожалуйста, разместите журнал как первую строку вашего doInBackground (так что мы уверены, что вы входите в нее). Также используйте этот код для чтения данных из InputStream и попробуйте :) (обновленный мой ответ) – StErMi

+0

Спасибо человеку. Я был идиотом: P –

0

Ой ... вы создаете свою задачу с объектом деятельности (это) (???)

AsyncTask task = new JSONParser(this).execute("http://10.0.2.2:1288/webservic /gettools.aspx"); 

, но ваша задача ожидает View

public JSONParser(ListFragment fragment) { 

им удивлен, что это оленья кожа сгенерирует исключение

+0

Я вызываю задачу из ListFragment. Проблем нет. –

+0

вы вызываете его из списка? oehm ... как? в eventlistener? – CAA

+0

открытый класс TestFragment extends ListFragment { public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); AsyncTask task = new JSONParser (this) .execute ("http://10.0.2.2:1822/webservice/gettools.aspx");}} –

Смежные вопросы