2014-03-13 69 views
0

我有后台任务,我想在运行时显示确定水平进度条。我希望用户能够看到过程的实际进度,因此我无法使用不确定的进度条。用进度条显示后台任务的实际进度

这里是后台的任务,我想显示一个进度:

ParseCloud.callFunctionInBackground("invite", params, 
      new FunctionCallback<String>() { 

       @Override 
       public void done(String object, ParseException e) { 
        // TODO Auto-generated method stub 
        Log.i("tag", "user create has run"); 
        if (e == null) { 

         Toast.makeText(getActivity(), "successful" + mPhone, Toast.LENGTH_LONG).show(); 



        } else { 
         String errorMessage = e.getMessage().toString(); 
         Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show(); 



        } 

       } 

      }); 

我曾经想过用的AsyncTask,但这种ParseCloud.callFunctionInBackground一段代码为自己创建一个新的线程和运行其任务它。所以,当我在AsyncTask的背景中调用它时,它到达代码的这一部分的时候为它创建一个新的线程,即留下由AsyncTask的doInBackground创建的线程。然后因为没有更多的工作在其线程上完成,doInBackground结束并且onPostExecute被调用,同时该任务仍在其创建的线程上运行。无论进展如何,我都显得毫无用处。

有没有一种方法可以获得进程的进度并显示确定水平进度条?

+0

您可以使用onProgressUpdate()是指HTTP ://www.androidhive.info/2012/04/android-downloading-file-by-showing-progress-bar/ –

+0

不,问题是在doInBackground里面有另一个线程,所以doInBackground立即完成。 onProgressUpdate会直接跳到100%。 –

回答

0

更新:忽略这一点,我想这是行不通的,你需要一个AsyncTask

如果该功能已经在后台运行,你并不需要一个AsyncTask。从你的代码片段中,done函数在完成时调用,因此它与postExecute的情况相同。如果您有一些中间功能来获取进度,则可以使用Looper.getMainLooper()重新连接到主线程。

另一种选择是使用Looper.myLooper()ParseCloud获得线程,并与AsyncTask的螺纹连接,所以doInBackground没有完成的时候了。

更新:这是比较容易:

您可以简单地使用runOnUiThread(我使用的是可运行在一个新的线程来模拟ParseCloud):

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mTextProgress = (TextView) findViewById(R.id.text_progress); 

    Button slowButton = (Button) findViewById(R.id.button_slow); 
    slowButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mTask.execute((Void[]) null); 
     } 
    }); 
} 

private void updateUi(int i) { 
    mTextProgress.setText(String.valueOf(i)); 
} 


Runnable mRunnable = new Runnable() { 
    @Override 
    public void run() { 
     for (int i = 0; i < 100; i += 10) { 
      try { 
       final int finalI = i; 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         updateUi(finalI); 
        } 
       }); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 

private AsyncTask<Void, Integer, Void> mTask = new AsyncTask<Void, Integer, Void>() { 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     mTextProgress.setText(values[0].toString()); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     new Thread(mRunnable).run(); 
     return null; 
    } 
}; 
+0

第二个选项听起来是最好的......你能举个例子吗? – KingBryan

+0

谢谢。让我尝试一下..所以我应该把我的函数放在runOnUiThread中?......有没有一种方法可以在确定的水平进度条上显示进度...因此用户可以看到进度究竟有多远。 – KingBryan

+0

将进度信息放入runOnUiThread中。在我的例子中,方法运行本身在后台运行,但是在每次迭代时它都会在ui线程上发布更新。这与AsyncTask与publishProgress一起使用的方式相同。 –