2015-01-13 6 views
0

Когда я написал этот код, он дает NetworkOnMainThreadException, поэтому я хочу его реализовать, используя AsyncTask Хотя я видел много вопросов и ответов об этой ошибке, но не смог написать. Я хочу передать аргумент классу Asynctask и хочу назначить возвращенные данные переменной в текущем классе. Пожалуйста, помогите мне. Вот мой кодКак исправить NetworkOnMainThreadException в Android с помощью AsyncTask

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    int tem = 1940+position; 
    String temp = ""+tem; 
    String ReceivedData ="<"; 
    GettingInternetData something = new GettingInternetData(temp); 
    try { 
     ReceivedData = something.getMoviesData(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

GettingInternetData.java

public class GettingInternetData { 

    String y = null; 
    public GettingInternetData(String year) { 
     // TODO Auto-generated constructor stub 
     y = year; 
    } 
public String getMoviesData() throws Exception 
{ 
    BufferedReader toRead = null; 
    String data = null; 
    try 
    { 
     HttpClient client = new DefaultHttpClient(); 
     URI url = new URI("URL goes here which requires an argument temp"); 
     HttpGet getting = new HttpGet(); 
     getting.setURI(url); 
     HttpResponse resp = client.execute(getting); 
     toRead = new BufferedReader(new InputStreamReader(resp.getEntity().getContent())); 
     StringBuffer alldata = new StringBuffer(); 
     String l =""; 
     String nl = System.getProperty("line.Separator"); 
     while((l = toRead.readLine()) !=null) 
     { 
      alldata.append(l + nl); 
     } 
     toRead.close(); 
     data = alldata.toString(); 
     return data; 
    } 
    finally{ 
     if (toRead != null){ 
      try{ 
       toRead.close(); 
       return data; 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
} 
} 

Заранее спасибо

+0

возможный дубликат [android.os.NetworkOnMainThreadException] (Http: // StackOverflow. com/questions/6343166/android-os-networkonmainthreadexception) – 2Dee

+0

Ужасный вопрос, дубликат многих других подобных, но на этот раз вы говорите: «Я знаю, что мне нужно использовать AsyncTask», но вы не показываете, что вы пробовали, используя его, что хуже ... – 2Dee

ответ

0

Вы хотите, чтобы передать аргументы пользовательских AsyncTask, которые это делают работу в методе doInBackground() и верните любые результаты. Затем вы можете обработать результаты в методе onPostExecute(). Для более подробного объяснения AsyncTask вы можете найти эту статью полезной: http://po.st/Cei3m2

0

попробовать это

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    new InternetAsynTask().execute(String.valueOf(1940+position)); 
} 

public static class InternetAsynTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     GettingInternetData gettingInternetData = new GettingInternetData(params[0]); 
     return gettingInternetData.getMoviesData(); 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     // TODO: 
     // processing receive data here 
    } 
} 
0

Во-первых, вы не должны вызывать какую-либо услугу получения или размещения информации через Интернет с вашего приложения основного потока. Таким образом, вы можете использовать android os, предоставленный asynctask. Также вы сказали, что хотите передать информацию в asynctask. Я думаю, что это поможет, private class SyncWithServerTask extends AsyncTask<VALUE, Void, String> { protected Long doInBackground(VALUE... values) { int count = valus.length; for (int i = 0; i < count; i++) { publishProgress((int) ((i/(float) count) * 100)); //HERE YOUR CODE // Escape early if cancel() is called if (isCancelled()) break; } return result; }

protected void onProgressUpdate(Integer... progress) { 
    setProgressPercent(progress[0]); 
} 

protected void onPostExecute(String result) { 
    showDialog(result); 
} 

}

затем, вызовите службу, используя, new SyncWithServerTask().execute(value1, value2, value3);

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