2013-09-25 4 views
0

Я искал повсюду для этого, и единственный ответ, который у меня был, это «использовать пар», но я не могу заставить это работать.Любой пример использования 2 разных классов для onProgressUpdate в Asynctask?

Вот что мне нужно: В Asynctask мне нужно обновить индикатор выполнения и текст. Из-за этого мой общий Asynctask не может быть просто Integer, а не только String, но и то, и другое. Это значит, что у меня есть оба класса в методе onProgressUpdate.

Может кто-нибудь дать мне пример или ссылки относительно того, как я добавляю строки и увеличиваю целое число в «doInBackground», и как реализовать это в «onProgressUpdate»?

спасибо!

ответ

0

Можете ли вы создать свой собственный простой класс для хранения переменных, а затем передать это?

Или, если вы передадите строку, в которой вы можете разобрать и получить нужные значения? Если вы берете свою первую строку + = ":" + int, тогда используйте что-то вроде

String myString = passedString.substring(0, passedString.lastIndexOf(":"))) 
int i = Integer.parseInt(passedString.substring(passedString.lastIndexOf(":")+1)); 
+0

Да, я предполагаю, что это единственный способ сделать это , Я просто хотел узнать, есть ли другой способ передать оба значения без необходимости создавать пользовательский класс ... Thanx. – TooManyEduardos

0

Насколько я понимаю ваш вопрос; есть главным образом две вещи, которые вы хотите сделать:

1) Обрабатывайте поток пользовательского интерфейса, находясь в doIneBackground(). 2) Внедрите onProgressUpdate().

В принципе, мы не должны пытаться получить доступ к потоку пользовательского интерфейса во время работы фонового процесса. Причина в том, что это очень ясно ... @ OS уровень будет так много потоков будет running.And в этом случае Это будет хаос на экране, если мы можем обновить интерфейс из фонового потока.

Для 2-й, который я хотел бы рекомендовать вам взглянуть на этот пример:

ProgressDialog mProgressDialog; 
mProgressDialog = new ProgressDialog(YourActivity.this); 
mProgressDialog.setMessage("A message"); 
mProgressDialog.setIndeterminate(true); 
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
mProgressDialog.setCancelable(true); 
final DownloadTask downloadTask = new DownloadTask(YourActivity.this); 
downloadTask.execute("the url to the file you want to download"); 
mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 
    @Override 
    public void onCancel(DialogInterface dialog) { 
     downloadTask.cancel(true); 
    } 
}); 

В AsynTask:

private class DownloadTask extends AsyncTask<String, Integer, String> { 

private Context context; 

public DownloadTask(Context context) { 
    this.context = context; 
} 

@Override 
protected String doInBackground(String... sUrl) { 
    // take CPU lock to prevent CPU from going off if the user 
    // presses the power button during download 
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
     getClass().getName()); 
    wl.acquire(); 

    try { 
     InputStream input = null; 
     OutputStream output = null; 
     HttpURLConnection connection = null; 
     try { 
      URL url = new URL(sUrl[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      // expect HTTP 200 OK, so we don't mistakenly save error report 
      // instead of the file 
      if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) 
       return "Server returned HTTP " + connection.getResponseCode() 
        + " " + connection.getResponseMessage(); 

      // this will be useful to display download percentage 
      // might be -1: server did not report the length 
      int fileLength = connection.getContentLength(); 

      // download the file 
      input = connection.getInputStream(); 
      output = new FileOutputStream("/sdcard/file_name.extension"); 

      byte data[] = new byte[4096]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       // allow canceling with back button 
       if (isCancelled()) 
        return null; 
       total += count; 
       // publishing the progress.... 
       if (fileLength > 0) // only if total length is known 
        publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 
     } catch (Exception e) { 
      return e.toString(); 
     } finally { 
      try { 
       if (output != null) 
        output.close(); 
       if (input != null) 
        input.close(); 
      } 
      catch (IOException ignored) { } 

      if (connection != null) 
       connection.disconnect(); 
     } 
    } finally { 
     wl.release(); 
    } 
    return null; 
}} 

выше метод (doInBackground) всегда проходит на фоне нить. Вы не должны выполнять какие-либо задачи пользовательского интерфейса. С другой стороны, onProgressUpdate и onPreExecute работать в потоке пользовательского интерфейса, так что вы можете изменить индикатор:

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    mProgressDialog.show(); 
} 

@Override 
protected void onProgressUpdate(Integer... progress) { 
    super.onProgressUpdate(progress); 
    // if we get here, length is known, now set indeterminate to false 
    mProgressDialog.setIndeterminate(false); 
    mProgressDialog.setMax(100); 
    mProgressDialog.setProgress(progress[0]); 
} 

@Override 
protected void onPostExecute(String result) { 
    mProgressDialog.dismiss(); 
    if (result != null) 
     Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show(); 
    else 
     Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show(); 
} 

С уважением

Сатью

+0

Thanx, но мой вопрос только в том, как передать 2 типа в onProgressUpdate. Ваш ответ показывает, как работает весь рабочий процесс asynctask, но только передает 1 тип в onProgressUpdate, который не то, что я искал. Thanx в любом случае, хотя. – TooManyEduardos

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