2014-09-22 2 views
-1

나는이 안드로이드에 대한 간단한 백업 응용 프로그램을 만들고이 코드는 전화 메모리에있는 모든 메시지를 읽고 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(); 



    } 



} 



} 

진행 표시 줄이 나타나지만 업데이트되지 않습니다 ...이 코드는 완벽하게 작동합니다 ...이 코드에 확정 된 프로 게스 바를 구현할 수있는 방법에 대한 제안이 필요합니다. 감사합니다.

EDIT : 2 개의 답변을 게시했습니다. 진행률 표시 줄 대신 코드를 다시 작성했습니다. 코드가 끝나면 0에서 100으로 건너 뜁니다.이 코드에서 실수를 지적 해주십시오.

답변

0

코드의 어느 곳에서나 진행률 표시 줄을 업데이트하는 것을 보지 못합니다.

AsyncTask는 방법 doInBackground()의에서 UI에 액세스 할 수 없습니다 : 어쩌면

그러나 여기 당신이해야 할 것입니다 ... 주변에 너무 많은 관련이없는 코드가 있기 때문이다. AsyncTask 실행 중에 onProgressUpdate() 함수에서만 UI에 액세스 할 수 있습니다. 이 함수를 정의하지 않았으므로 업데이트를 수행 할 수 없습니다.

문서 : onProgressUpdate()

+1

나는 우리가'onPreExecute()'와'onPostExecute()가'너무에서 UI에 액세스 할 수 있습니다 생각합니다. :) –

+0

아 잠깐,이 잘못 됐어. 나는 진행 상황 업데이트에 대해서만 생각하고 있었다 ... : D – PKlumpp

관련 문제