2015-05-05 2 views
1

Я прошу прощения в программировании, но я здесь, чтобы попросить совета. Я делаю приложение, которое предоставляет вам системные данные, такие как загрузка процессора, оперативная память и т. Д. У меня есть все, что мне нужно, и это работает! Но есть проблема, когда я нажимаю кнопку, которая запускает новую активность, в которой я могу видеть информацию о системе, также в этом действии я запускаю метод getSystemInfo() в методе onCreate(), который получает всю необходимую мне информацию, и это требуется некоторое время, пока это не будет сделано, что означает черный экран, и пользователь должен подождать ..Выполнение метода в цикле через AsyncTask - Android?

Я хотел бы начать и загрузить активность перед выполнением метода getSystemInfo(), который должен выполняться в фоновом режиме в цикле до нажата кнопка goBack пользователя.

Я видел это: How to use AsyncTask correctly in Android, но мне все еще слишком сложно.

Любая помощь будет оценена. Спасибо, миллион раз!

Мой код здесь:

public class SystemInfoActivity extends Activity{ 

TextView outCPU; 
TextView outMEM; 
TextView outTASKS; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_systeminfo); 
    Log.d("MSG:", "running"); 

    outCPU = (TextView) findViewById(R.id.outCPU); 
    outMEM = (TextView) findViewById(R.id.outMEM); 
    outTASKS = (TextView) findViewById(R.id.outTASKS); 

    getSystemInfo(); 

} 

protected void getSystemInfo() { 

    //**********CPU******** 
    RunCommandTOP top = new RunCommandTOP(); 
    int[] cpuUsage = top.CommandTOP(); 

    int user = cpuUsage[0]; 
    int system = cpuUsage[1]; 
    int total = (system + user); 
    outCPU.setText("CPU usage: " + user + "% user, " + system + "% system, " + total + "% total"); 


    //**********RAM******** 
    ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
    ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); 
    activityManager.getMemoryInfo(memoryInfo); 
    long availibleMB = memoryInfo.availMem/1048576L; 
    long totalMB = memoryInfo.totalMem/1048576L; 
    long usedMB = totalMB - availibleMB; 

    outMEM.setText("RAM usage: " + usedMB + "/" + totalMB + "MB"); 

    //**********TASKS******** 
    RunCommandPS ps = new RunCommandPS(); 
    String commandLines = ps.CommandPS(); 

    int NumberLines = countTasks(commandLines); 
    int Tasks = NumberLines - 1; 

    outTASKS.setText("Tasks: " + Tasks); 

} 

private static int countTasks(String str) { 
    String[] lines = str.split("\r\n|\r|\n"); 
    return lines.length; 
} 

public void onBackPressed() { 
    Log.i("MSG", "Going back"); 
    Intent intent = new Intent(this, MainActivity.class); 
    startActivity(intent); 
    finish(); 
    //return true; 
} 
} 
+0

какие вопросы вы с помощью AsyncTask? Это более простой способ обработки асинхронных задач, поскольку вы можете использовать сервисы, но, на мой взгляд, это немного сложнее. –

+0

5 минут вам нужно это понять http://developer.android.com/reference/android/os/AsyncTask.html –

ответ

2

Это простой в использовании человек.

просто позвоните дальшеСоздайте метод следующей строки новый Async(). Execute();

но набор текста и обновления пользовательского интерфейса в onPostExecute, вы можете вернуть некоторые Params в методе doInBackground и получить их в onPostExecute

private class Async extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... params) { 
     String myParamsForUi = getSystemInfo(); 
     return myParamsForUi; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     outTASKS.setText("Tasks: " + result); 

    } 

} 
+0

ОК, но у него есть проблема с типом метода doInBackground ... Строка будет приятной, но она хочет, чтобы я изменил ее на void, есть ли способ решить это? – andrew

+0

У меня есть ответ –

+0

Спасибо, что работает для меня! Аплодируйте свою помощь! – andrew

0

поставить код, который должен быть асинхронными в классе AsyncTask.

Более подробная информация, как сделать это here

В основном то, что вы будете делать это расширить AsyncTask в пользовательском классе.

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

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

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

В творите в фоновом методе вы поместит работу, которую нужно сделать, и в postexecute вы будете иметь то, что происходит после того, как он закончится.

+0

Да, я понял, но не знаю, как работают методы методов в AsyncTask , Я хотел бы защитить String doInBackground(), но он не хочет, чтобы я это делал. Не могли бы вы рассказать, как должен выглядеть этот метод? – andrew

+0

вещь - это то, что вы возвращаете в фоновом режиме, это тип этого метода в методе post post. Это немного запутанно, но в моем примере вы видите, как вы возвращаете totalSize долго, и это пареметр в postexecute? –

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