2014-09-22 37 views
-1

我正在为android构建一个简单的备份应用程序,并且此代码读取并将手机内存中的所有消息存储到csv文件,最初我显示的是不确定的进度栏,但是应用程序的用户可能会对此感到不耐烦(如果他们的信息太多),所以我想添加一个确定的水平进度条向他们展示实际的进度,我一直在尝试做一些事情,但现在我不能得到它的权利,我知道我应该在异步任务类中使用onProgressUpdate方法,但我真的不知道如何实现,所以我得到了很多的例外,所以我试图在一个不同的没有方法,这是下面的代码如何更新异步进度栏任务

package daniel.idea.backup; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.res.AssetFileDescriptor; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.ContactsContract; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnClickListener { 


public ArrayList<String> smsBuffer = new ArrayList<String>(); 
String smsFile = "SMS"+".csv"; 
Integer x = 0; 
static Integer Total = 0; 


//Initialize the various ui elements 
Button contact,msg; 
ProgressDialog pb; 
TextView total; 
static Context mContext; 

//Method to fetch and write the contacts to the .vcf file 

public static String getVCF() { 
    final String vfile = "Contacts.vcf"; 
    Cursor phones = mContext.getContentResolver().query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 
    phones.moveToFirst(); 
    Total = phones.getCount(); 
    for (int i = 0; i < phones.getCount(); i++) { 
     String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); 
     Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey); 
     AssetFileDescriptor fd; 
     try { 
      fd = mContext.getContentResolver().openAssetFileDescriptor(uri, "r"); 
      FileInputStream fis = fd.createInputStream(); 
      byte[] buf = new byte[(int) fd.getDeclaredLength()]; 
      fis.read(buf); 
      String VCard = new String(buf); 
      String path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile; 
      FileOutputStream mFileOutputStream = new FileOutputStream(path, true); 
      mFileOutputStream.write(VCard.toString().getBytes()); 
      phones.moveToNext(); 
      Log.d("Vcard", VCard); 
      mFileOutputStream.close(); 
     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
    } 
    return phones.getCount()+ " Contacts"; 
} 


//This is the method used to get the sms and save them to a file 

     private String backupSMS(){ 
     smsBuffer.clear(); 
     Uri mSmsinboxQueryUri = Uri.parse("content://sms"); 
     Cursor cursor1 = mContext.getContentResolver().query(
       mSmsinboxQueryUri, 
       new String[] { "_id", "thread_id", "address", "person", "date", 
         "body", "type" }, null, null, null); 
     //startManagingCursor(cursor1); 
     String[] columns = new String[] { "_id", "thread_id", "address", "person", "date", "body", 
       "type" }; 
     if (cursor1.getCount() > 0) { 
      String count = Integer.toString(cursor1.getCount()); 
      Log.d("Count",count); 
      while (cursor1.moveToNext()) { 

       String messageId = cursor1.getString(cursor1 
         .getColumnIndex(columns[0])); 

       String threadId = cursor1.getString(cursor1 
         .getColumnIndex(columns[1])); 

       String address = cursor1.getString(cursor1 
         .getColumnIndex(columns[2])); 
       String name = cursor1.getString(cursor1 
         .getColumnIndex(columns[3])); 
       String date = cursor1.getString(cursor1 
         .getColumnIndex(columns[4])); 
       String msg = cursor1.getString(cursor1 
         .getColumnIndex(columns[5])); 
       String type = cursor1.getString(cursor1 
         .getColumnIndex(columns[6])); 



       smsBuffer.add(messageId + ","+ threadId+ ","+ address + "," + name + "," + date + " ," + msg + " ," 
         + type); 


      }   
      generateCSVFileForSMS(smsBuffer); 

     } 
     return cursor1.getCount() + "Messages";   
    } 


    private void generateCSVFileForSMS(ArrayList<String> list) 
    { 

     try 
     { 
      String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + smsFile; 
      FileWriter write = new FileWriter(storage_path); 

      write.append("messageId, threadId, Address, Name, Date, msg, type"); 
      write.append('\n'); 

      for (String s : list) 
      { 
       write.append(s); 
       write.append('\n'); 
      } 
      write.flush(); 
      write.close(); 
     } 

     catch (NullPointerException e) 
     { 
      System.out.println("Nullpointer Exception "+e); 
      // e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 

    mContext = MainActivity.this; 
    Cursor phones_total = mContext.getContentResolver().query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 

    //This gets the count of all the contacts in the phone memory 
    Integer total_contacts = phones_total.getCount(); 

    contact = (Button) findViewById (R.id.bt_contacts); 
    msg = (Button) findViewById (R.id.bt_messages); 
    total = (TextView) findViewById (R.id.tv_total); 


    contact.setOnClickListener(this); 
    msg.setOnClickListener(this); 
    total.setText(total_contacts +" Contacts"); 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 

    switch(v.getId()){ 

    case R.id.bt_contacts: 

     MyTask task = new MyTask(); 
     task.execute("Param 1","Param2","Param3"); 


     break; 

    case R.id.bt_messages: 

     SmsTask task2 = new SmsTask(); 
     task2.execute(); 
    } 

} 


public class MyTask extends AsyncTask<String, Integer, String>{ 

    @Override 
    protected void onPreExecute() { 

     //make the progressDialog 
     pb = new ProgressDialog(MainActivity.this); 
     pb.setTitle("Please wait ..."); 
     pb.setIndeterminate(false); 
     pb.setMessage("Backing up contacts..."); 
     pb.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     pb.setProgress(0); 
     pb.setMax(100); 
     pb.show(); 


    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     mContext = MainActivity.this; 

     String total_c = getVCF(); 

     //Increment the progress dialog 

     for(int i = 0; i < Total; i++){ 

      publishProgress(i); 

     } 

     return total_c; 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

     //hide the progress bar and display a toast message 

     pb.dismiss(); 
     Toast.makeText(MainActivity.this, result + " Succesfully backed up", Toast.LENGTH_LONG).show(); 


    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 

     pb.incrementProgressBy(values[0]); 

     values[0]++; 
    } 


} 


public class SmsTask extends AsyncTask <String,Integer,String>{ 


     protected void onPreExecute() { 

      //show the progress bar 
      pb = ProgressDialog.show(MainActivity.this, "Processing", 
        "please wait", true); 

      } 


     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 
      mContext = MainActivity.this; 

      String total_sms = backupSMS(); 

      return total_sms; 



     } 


     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 

      //hide the progress bar and display a toast 

      pb.dismiss(); 
      Toast.makeText(MainActivity.this, result + " Succesfully backed up", Toast.LENGTH_LONG).show(); 



    } 



} 



} 

进度条显示出来,但它没有更新...除此之外代码工作完美...请我需要建议我如何实现一个确定的progess栏到此代码。谢谢

编辑:我已经经历了发布的两个答案,并且我已经重写了我的代码,而不是更新它的进度条,只是在完成时跳过从0到100,请有人指出我在此代码中的错误

回答

0

我看不到您在代码中的任何位置更新进度条。也许是因为在它周围有这么多不相干的代码......

但这里是你必须做的:

AsyncTask具有对UI没有访问从它的方法doInBackground()。在执行AsyncTask期间,您只能从onProgressUpdate()函数访问UI。你没有定义这个函数,所以不能执行任何更新。

文档:onProgressUpdate()

+1

我认为我们可以从'onPreExecute()'和'onPostExecute()',也访问UI。 :) – 2014-09-22 11:11:28

+0

啊等一下,我弄错了。我只想着进度更新......:D – PKlumpp 2014-09-22 11:12:09