2017-05-29 7 views
0

サーバーからファイルをダウンロードできるPHP Webサービスを使用してアプリケーションを作成したいと思います。アンドロイドのボタンクリックイベントからサーバーからファイルをダウンロードするには

これは私の詳細クラスです:進歩は、私は私のSDカードのフォルダをチェックし終えたとき、それは、ダウンロードの進捗を開始

public class ImportExportDataDetails extends Activity { 

int id; 
Button btnback; 
public static final int DIALOG_DOWNLOAD_PROGRESS = 0; 
private Button startBtn; 
private ProgressDialog mProgressDialog; 



TextView txtname,tvfile1,tvfile2,tvdetail; 
ImageView imgflag; 
Button btnfile1,btnfile2; 
String url1,url2,filenm1,filenm2; 
private DefaultHttpClient httpclient; 
private HttpPost httppost; 
private ArrayList<NameValuePair> lst; 

public static String[] image; 
public static String[] name; 
public static String[] file1; 
public static String[] file2; 
public static String[] fnm1; 
public static String[] fnm2; 
public static String[] detail; 

private JSONArray users =null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_import_export_data_details); 
    Intent i=getIntent(); 
    id=i.getIntExtra("id", 0); 

    txtname=(TextView)findViewById(R.id.txtname); 
    tvfile1=(TextView)findViewById(R.id.tvfile1); 
    tvfile2=(TextView)findViewById(R.id.tvfile2); 
    tvdetail=(TextView)findViewById(R.id.tvdetail); 

    imgflag=(ImageView)findViewById(R.id.imgflag); 

    btnfile1=(Button)findViewById(R.id.btnfile1); 
    btnfile2=(Button)findViewById(R.id.btnfile2); 
    btnback=(Button)findViewById(R.id.btnback); 

    btnback.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      Intent i=new Intent(getApplicationContext(),ImportExportData.class); 
      startActivity(i); 
     } 
    }); 
    httpclient=new DefaultHttpClient(); 
    httppost= new HttpPost("http://kalalunsons.com/webservice/web-import-export-data-details.php?import_export=1"); 
    lst=new ArrayList<NameValuePair>(); 
    lst.add(new BasicNameValuePair("im_ex_data_id", Integer.toString(id))); 
    try { 
     httppost.setEntity(new UrlEncodedFormEntity(lst)); 
     new details().execute(); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    btnfile1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      startDownload(); 

     } 

    }); 
} 
private void startDownload() { 
     String url = url1; 
     new DownloadFileAsync().execute(url); 
    } 
    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
      case DIALOG_DOWNLOAD_PROGRESS: 
       mProgressDialog = new ProgressDialog(this); 
       mProgressDialog.setMessage("Downloading file.."); 
       mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
       mProgressDialog.setCancelable(false); 
       mProgressDialog.show(); 
       return mProgressDialog; 
      default: 
       return null; 
     } 
    } 
    class DownloadFileAsync extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      showDialog(DIALOG_DOWNLOAD_PROGRESS); 
     } 

     @Override 
     protected String doInBackground(String... aurl) { 
      int count; 

      try { 
       URL url = new URL(aurl[0]); 
       URLConnection conexion = url.openConnection(); 
       conexion.connect(); 

       int lenghtOfFile = conexion.getContentLength(); 
       // Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

       InputStream input = new BufferedInputStream(url.openStream()); 
       OutputStream output = new FileOutputStream("/sdcard/file.xlsx"); 

       byte data[] = new byte[1024]; 

       long total = 0; 

       while ((count = input.read(data)) != -1) { 
        total += count; 
        publishProgress(""+(int)((total*100)/lenghtOfFile)); 
        output.write(data, 0, count); 
       } 

       output.flush(); 
       output.close(); 
       input.close(); 
      } catch (Exception e) {} 
      return null; 

     } 
     protected void onProgressUpdate(String... progress) { 
      Log.d("ANDRO_ASYNC",progress[0]); 
      mProgressDialog.setProgress(Integer.parseInt(progress[0])); 
     } 

     @Override 
     protected void onPostExecute(String unused) { 
      dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 
     } 
    } 

class details extends AsyncTask<String, integer, String>{ 

    String jsonstring; 
    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     try { 
      HttpResponse httpresponse=httpclient.execute(httppost); 
      jsonstring=EntityUtils.toString(httpresponse.getEntity()); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return jsonstring; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     JSONObject JsonObject=null; 
     try { 
      JsonObject =new JSONObject(result); 
      JSONObject jobj=JsonObject.getJSONObject("0"); 
      users=jobj.getJSONArray("import_export"); 

      name=new String[users.length()]; 
      image=new String[users.length()]; 
      detail=new String[users.length()]; 
      file1=new String[users.length()]; 
      file2=new String[users.length()]; 
      fnm1=new String[users.length()]; 
      fnm2=new String[users.length()]; 

      for(int i=0;i<users.length();i++){ 
       JSONObject jo=users.getJSONObject(i); 

       name[i]=jo.getString("name"); 
       image[i]=jo.getString("image"); 
       detail[i]=jo.getString("details"); 
       file1[i]=jo.getString("file"); 
       file2[i]=jo.getString("file2"); 
       fnm1[i]=jo.getString("file_name"); 
       fnm2[i]=jo.getString("file_name"); 

       txtname.setText(name[i]); 
       Picasso.with(getApplicationContext()).load(image[i]+"?import_export=1").into(imgflag); 
       tvdetail.setText(Html.fromHtml(detail[i])); 
       tvfile1.setText(fnm1[i]); 
       tvfile2.setText(fnm2[i]); 
       url1=file1[i]; 
       url2=file2[i]; 
       filenm1=tvfile1.getText().toString(); 
       filenm1=filenm1.toLowerCase()+".xlsx"; 

      } 
      //Toast.makeText(getApplicationContext(), url1, Toast.LENGTH_LONG).show(); 

     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


} 

その場合logcatは、私はこのコードを実行する任意のerror.whenは表示されませんがどのファイルも表示されませんでしたが、ファイルは正常にダウンロードされましたが、バイナリ形式で表示されます。私はコード内で何が変わることができますか?そしてそれをsdcardにどのように表示できますか?

+0

ポストlogcat。 –

+0

コード、XML、またはlogcat出力のスクリーンショットを投稿しないでください。質問自体にすべてのテキストをテキストとして投稿してください。つまり、メッセージのために 'Toast'に任意の' int'を渡すことはできません。それを 'String'に変換する必要があります。また、 'doInBackground()'というスレッドから 'Toast 'を直接実行することはできません。デバッグのためだけに使用している場合は、代わりにログ印刷を使用してください。 –

答えて

0

問題:別のスレッドで実行されるdoInBackground()でToastを表示しています。あなたはいくつかの情報を表示したい場合は、使用ログの代わりにトースト、doInBackground()メソッド

からトーストメッセージを削除

+0

ありがとう、しかし私はトーストを取っても何も変わっていません。 –

1

あなたはネットワーク呼び出しのためのいくつかのライブラリを使用することができます -

retrofit-を

http://www.androidhive.info/2016/05/android-working-with-retrofit-http-library/

背景とUIスレッドは別々のスレッドです。 UIスレッドでは、トーストメッセージのようなビューとUIを更新し、イメージを読み込むことができます。ここ

は、最初にこれを読んで、asynctaskについて学ぶのに最適な一品です - テキストとして

https://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/

関連する問題