0

AsyncTask をアプリで動作させるのに問題があります。このチュートリアルの一部に従いました: http://samir-mangroliya.blogspot.in/p/android-asynctask-example.html。ただし、私のリストは読み込まれません。

私の元のコード:

public class MainActivity extends ListActivity {  

private File file;
private List<String> myList;

String dirNameSlash = "/Videos";
String path = Environment.getExternalStorageDirectory() + dirNameSlash;
public static final String PREFS_NAME = "MyApp";

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    ListView lv = getListView();

    lv.setOnItemLongClickListener(new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) {

            try {
                String root_sd = Environment.getExternalStorageDirectory().toString();
                String theFile = root_sd + "/Videos/" + (String) getListAdapter().getItem(row);
                File file = new File(theFile);
                FileInputStream source= new FileInputStream(file);
                String targetDirectory = Environment.getExternalStorageDirectory().toString();
                FileOutputStream destination = new FileOutputStream(targetDirectory + "/Saved/" + file.getName() + ".mp4");
                FileChannel sourceFileChannel = source.getChannel();
                FileChannel destinationFileChannel = destination.getChannel();
                long size = sourceFileChannel.size();

                sourceFileChannel.transferTo(0, size, destinationFileChannel);

                source.close();
                destination.close();

                Toast.makeText(getApplicationContext(), "Video was copied successfully to '/sdcard/Saved'", Toast.LENGTH_LONG).show();

            } catch (Exception ex) {
                Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
                Toast.makeText(getApplicationContext(), "Error when copying", Toast.LENGTH_LONG).show();
            }

            return true;
        }
    });

    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
        Log.d("MyApp", "No SDCARD");
    } else {
        File directory = new File(Environment.getExternalStorageDirectory()+File.separator+"Saved");
        directory.mkdirs();

    }

    myList = new ArrayList<String>();   

    String root_sd = Environment.getExternalStorageDirectory().toString();
    file = new File( root_sd + "/Videos" ) ;       
    File list[] = file.listFiles();

    for( int i=0; i< list.length; i++)
    {
        myList.add( list[i].getName() );
    }

    setListAdapter(new ArrayAdapter<String>(this,
            R.layout.row, myList )); 


protected void onListItemClick(ListView l, View v, int position, long id) 
{
    super.onListItemClick(l, v, position, id);
    String item = (String) getListAdapter().getItem(position);
    Intent intentToPlayVideo = new Intent(Intent.ACTION_VIEW);
    intentToPlayVideo.setDataAndType(Uri.parse(path + item), "video/*");
    startActivity(intentToPlayVideo);
}



}         

AsyncTask を使用した私のコード:

public class MainActivity extends ListActivity {  

private File file;
private List<String> myList;
Load objMyTask;

String dirNameSlash = "/Videos";
String path = Environment.getExternalStorageDirectory() + dirNameSlash;
public static final String PREFS_NAME = "MyPref";

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    ListView lv = getListView();

    lv.setOnItemLongClickListener(new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) {

            try {
                String root_sd = Environment.getExternalStorageDirectory().toString();
                String theFile = root_sd + "/Videos" + (String) getListAdapter().getItem(row);
                File file = new File(theFile);
                FileInputStream source= new FileInputStream(file);
                String targetDirectory = Environment.getExternalStorageDirectory().toString();
                FileOutputStream destination = new FileOutputStream(targetDirectory + "/Saved" + file.getName() + ".mp4");
                FileChannel sourceFileChannel = source.getChannel();
                FileChannel destinationFileChannel = destination.getChannel();
                long size = sourceFileChannel.size();

                sourceFileChannel.transferTo(0, size, destinationFileChannel);

                source.close();
                destination.close();

                Toast.makeText(getApplicationContext(), "Video was copied successfully to '/sdcard/Saved'", Toast.LENGTH_LONG).show();

            } catch (Exception ex) {
                Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
                Toast.makeText(getApplicationContext(), "Error when copying", Toast.LENGTH_LONG).show();
            }

            return true;
        }
    });

    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
        Log.d("MyApp", "No SDCARD");
    } else {
        File directory = new File(Environment.getExternalStorageDirectory()+File.separator+"Saved");
        directory.mkdirs();


    }


        setListAdapter(new ArrayAdapter<String>(this,
                R.layout.row, myList )); 


    objMyTask = new Load();

    objMyTask.execute();

}

protected void onListItemClick(ListView l, View v, int position, long id) 
{
    super.onListItemClick(l, v, position, id);
    String item = (String) getListAdapter().getItem(position);
    Intent intentToPlayVideo = new Intent(Intent.ACTION_VIEW);
    intentToPlayVideo.setDataAndType(Uri.parse(path + item), "video/*");
    startActivity(intentToPlayVideo);
}



}


private class Load extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... params) {
    myList = new ArrayList<String>();   

    String root_sd = Environment.getExternalStorageDirectory().toString();
    file = new File( root_sd + "/Videos" ) ;       
    File list[] = file.listFiles();

    for( int i=0; i< list.length; i++)
    {
        myList.add( list[i].getName() );
    }

        return null;
    }

}

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

notifyDatasetChangedasynctask からリストを取得した後、アダプターを呼び出さないでください

メソッドを使用しonPostExecute()てそこで呼び出す必要があります

これをしないでください

setListAdapter(new ArrayAdapter<String>(this,
            R.layout.row, myList ));

アダプターを取り出し、そのインスタンスを保持して、後でリストを取得したときに使用します

ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.row, myList )
setListAdapter(adapter);

それからただするadapter.notifyDatasetChanged()

于 2013-09-17T18:46:33.763 に答える