나는이 안드로이드에 대한 간단한 백업 응용 프로그램을 만들고이 코드는 전화 메모리에있는 모든 메시지를 읽고 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으로 건너 뜁니다.이 코드에서 실수를 지적 해주십시오.
나는 우리가'onPreExecute()'와'onPostExecute()가'너무에서 UI에 액세스 할 수 있습니다 생각합니다. :) –
아 잠깐,이 잘못 됐어. 나는 진행 상황 업데이트에 대해서만 생각하고 있었다 ... : D – PKlumpp