【问题标题】:Android in-app downloader with progress bar?带有进度条的 Android 应用内下载器?
【发布时间】:2014-07-14 04:31:26
【问题描述】:

我正在尝试将游戏的模组文件下载到特定文件夹,但遇到了一些问题。我已经制作了下载代码,但它使应用程序崩溃,我想制作一个下载进度条,但不太确定如何做。这是我的代码:

package com.dogger20011.mcpemodlocater;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class v090 extends Activity {
/** Called when the activity is first created. */

Button button;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.v090);

    button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DownloadFromUrl();
        }
    });
}

public void DownloadFromUrl() {
    try {

        URL url = new URL("https://docs.google.com/uc? 
authuser=0&id=0B6ocq4LWhNJkRlpXelpheGtnZUE&export=download");
        HttpURLConnection c = (HttpURLConnection) url.openConnection();
        c.setRequestMethod("GET");
        c.setDoOutput(true);
        c.connect();

        String Path = Environment.getExternalStorageDirectory() +      
"sdcard/Android/data/com.snowbound.pockettool.free/Patches/";
        Log.v("PortfolioManger", "PATH: " + Path);
        File file = new File(Path);
        file.mkdirs();
        FileOutputStream fos = new FileOutputStream("shader mod.mod");

        InputStream is = c.getInputStream();

        byte[] buffer = new byte[702];
        int len1 = 0;
        while ((len1 = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len1);
        }
        fos.close();
        is.close();
    } catch (IOException e) {
        Log.d("PortfolioManger", "Error: " + e);
    }
    Log.v("PortfolioManger", "Check: ");
}

}

07-13 16:13:40.537:E/AndroidRuntime(1084):致命异常:主要 07-13 16:13:40.537:E/AndroidRuntime(1084):进程:com.dogger20011.mcpemodlocater,PID:1084 07-13 16:13:40.537: E/AndroidRuntime(1084): android.os.NetworkOnMainThreadException 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 java.net.InetAddress.getAllByName(InetAddress.java:214) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:161) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.dogger20011.mcpemodlocater.v090.DownloadFromUrl(v090.java:43) 07-13 16:13:40.537: E/AndroidRuntime(1084): at com.dogger20011.mcpemodlocater.v090$1.onClick(v090.java:31) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 android.view.View.performClick(View.java:4438) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 android.view.View$PerformClick.run(View.java:18422) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 android.os.Handler.handleCallback(Handler.java:733) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 android.os.Handler.dispatchMessage(Handler.java:95) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 android.os.Looper.loop(Looper.java:136) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 android.app.ActivityThread.main(ActivityThread.java:5017) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 java.lang.reflect.Method.invoke(Method.java:515) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 07-13 16:13:40.537: E/AndroidRuntime(1084): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 07-13 16:13:40.537: E/AndroidRuntime(1084): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你不需要某个地方的进度条吗?这是您需要采取的第一步。为什么不考虑一下并至少尝试一下。
  • 我首先想知道它为什么会崩溃,如果你愿意,我可以发布我的 logcat
  • 是的,当您遇到错误时,请始终提供 logcat。
  • 我刚刚将我的 logcat 添加到原始帖子中。对此感到抱歉

标签: android


【解决方案1】:

可以在您的 logcat 中看到 -

android.os.NetworkOnMainThreadException 07-13 16:13:40.537:

-你在主线程上运行你的网络代码。 Connecting to the Network 培训指南解释说,网络操作应在单独的线程上执行。

网络操作可能会出现不可预知的延迟。为防止这导致糟糕的用户体验,请始终在与 UI 不同的线程上执行网络操作。

您还可以在链接中找到有关正确方法的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多