2013-02-03 11 views
6

Próbuję zwrócić tablicę z mojego AsyncTask z powrotem do mojej aktywności, ponieważ próbuję utworzyć listę z tej tablicy. Niestety, program ogranicza błąd, ponieważ nie pozwala mi zwrócić tablicy. Moi kody są jak poniżej:Zwracanie tablicy [] z AsyncTask z powrotem do głównego działania

mainmenu Klasa:

public class MainMenu extends Activity { 
String username; 
public String[] returnValue; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_menu); 
    username ="user1"; 

if (checkInternetConnection()) { 

    try { 
     MainAsyncTask mat = new MainAsyncTask(MainMenu.this); 
     mat.execute(username); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} else { 
    Toast.makeText(getApplicationContext(),"No internet connection. Please try again later",Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main_menu, menu); 
    return true; 
} 

private boolean checkInternetConnection() { 
    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

    if (conMgr.getActiveNetworkInfo() != null 
      && conMgr.getActiveNetworkInfo().isAvailable() 
      && conMgr.getActiveNetworkInfo().isConnected()) { 
     return true; 
    } else { 
     return false; 
    } 
}} 

MainAsyncTask:

public class MainAsyncTask extends AsyncTask<String, Void, Integer> { 
    private MainMenu main; 
    private String responseText, http; 
    private Ipaddress ipaddr = new Ipaddress(http); 
    private Context context; 

    public MainAsyncTask(MainMenu main) { 
     this.main = main; 
    } 

    protected Integer doInBackground(String... arg0) { 
     int responseCode = 0; 
     try { 
      HttpClient client = new HttpClient(main.getApplicationContext()); 
      Log.e("SE3", ipaddr.getIpAddress()); 
      HttpPost httpPost = new HttpPost(ipaddr.getIpAddress() 
        + "/MainServlet"); 

      List<NameValuePair> nvp = new ArrayList<NameValuePair>(); 

      JSONObject json = new JSONObject(); 
      json.put("username", arg0[0]); 

      Log.e("SE3", arg0[0]); 

      nvp.add(new BasicNameValuePair("data", json.toString())); 
      httpPost.setEntity(new UrlEncodedFormEntity(nvp)); 

      HttpResponse response = client.execute(httpPost); 

      if (response != null) { 
       if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
        try { 
         BufferedReader reader = new BufferedReader(
           new InputStreamReader(response.getEntity() 
             .getContent())); 
         StringBuilder sb = new StringBuilder(); 
         String line; 
         while ((line = reader.readLine()) != null) { 
          sb.append(line); 
         } 
         responseText = sb.toString(); 
        } catch (IOException e) { 
         Log.e("SE3", "IO Exception in reading from stream."); 
         responseText = "Error"; 
        } 
       } else { 
        responseText = "Error"; 
       } 
      } else { 
       responseText = "Response is null"; 
      } 
     } catch (Exception e) { 
      responseCode = 408; 
      responseText = "Response is null"; 
      e.printStackTrace(); 
     } 
     return responseCode; 
    } 

    protected void onPostExecute(Integer result) { 
     if (result == 408 || responseText.equals("Error") 
       || responseText.equals("Response is null")) { 
      Toast.makeText(main.getApplicationContext(), 
        "An error has occured, please try again later.", 
        Toast.LENGTH_SHORT).show(); 
     } else { 
      JSONObject jObj; 
      try { 
       jObj = new JSONObject(responseText); 
       String folderString = jObj.getString("folder"); 

       String [] folders = folderString.split(";");  
       //I need to return folders back to MainMenu Activity 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Moje pytanie brzmi, jak mam się zmodyfikować tak, że jestem w stanie przeczytać moją tablicę z powrotem na mój aktywność z moimi połączeniami pozostaje nienaruszona.

Odpowiedz

3

Polecam że wyrażasz MainAsyncTask tak:

public class MainAsyncTask extends AsyncTask<String, Void, String[]> { 

Następnie zmodyfikować doInBackground zrobić wszystko, przetwarzanie, że jesteś teraz robi w onPostExecute (z wyjątkiem Toast części) i nie zwróci String[] (lub null, jeśli wystąpił błąd). Możesz zapisać kod wynikowy w zmiennej instancji o numerze MainAsyncTask i zwrócić błąd null. Następnie onPostExecute ma dostęp do tych samych informacji, które robi z twoim bieżącym kodem. Na koniec, jeśli nie ma błędu, po prostu wywołaj metodę z głównej aktywności z poziomu onPostExecute, aby zaktualizować interfejs użytkownika, przekazując mu wynik: String[].

Powiązane problemy