我正在尝试使用Fetch: The Best Downloading Library,但目前停留在侦听器部分。
这是下面的代码:
public class MainActivity extends AppCompatActivity {
Fetch fetch;
private TextView Title;
private TextView time;
private TextView percentage;
private TextView speed;
private EditText userUrl;
protected Request request;
String url = "";
@Override
protected void onDestroy() {
super.onDestroy();
fetch.close();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Title = findViewById(R.id.textView1);
time = findViewById(R.id.textView3);
percentage = findViewById(R.id.textView2);
speed= findViewById(R.id.textView4);
Button download = findViewById(R.id.button);
userUrl = findViewById(R.id.editText);
final FetchListener fetchListener = new FetchListener() {
@Override
public void onAdded(@NotNull Download download) {
Title.setText(getFileName(download.getFile()));
SetProgressView(download.getStatus(),download.getProgress());
UpdateView(download,0,0,null);
}
@Override
public void onCancelled(@NotNull Download download) {
UpdateView(download,0,0,null);
}
@Override
public void onCompleted(@NotNull Download download) {
UpdateView(download,0,0,null);
Toast.makeText(MainActivity.this, "Download Successful", Toast.LENGTH_SHORT).show();
}
@Override
public void onDeleted(@NotNull Download download) {
UpdateView(download,0,0,null);
}
@Override
public void onDownloadBlockUpdated(@NotNull Download download, DownloadBlock downloadBlock, int i) {
}
@Override
public void onError(@NotNull Download download, Error error, Throwable throwable) {
UpdateView(download,0,0,download.getError());
}
@Override
public void onPaused(@NotNull Download download) {
UpdateView(download,0,0,null);
}
@Override
public void onProgress(@NotNull Download download, long MilSec, long Bytes) {
UpdateView(download,MilSec,Bytes,null);
}
@Override
public void onQueued(@NotNull Download download, boolean b) {
Title.setText(getFileName(download.getFile()));
SetProgressView(download.getStatus(),download.getProgress());
UpdateView(download,0,0,null);
}
@Override
public void onRemoved(@NotNull Download download) {
UpdateView(download,0,0,null);
}
@Override
public void onResumed(@NotNull Download download) {
UpdateView(download,0,0,null);
}
@Override
public void onStarted(@NotNull Download download, List<? extends DownloadBlock> list, int i) {
UpdateView(download,0,0,null);
}
@Override
public void onWaitingNetwork(@NotNull Download download) {
//canceled on background thread
}
};
fetch.addListener(fetchListener);
download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (userUrl.getText().toString().equals("")) {
url = "https://www.google.co.in/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
} else {
url = userUrl.getText().toString();
}
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(MainActivity.this)
.setDownloadConcurrentLimit(3)
.build();
MainActivity.this.fetch = Fetch.Impl.getInstance(fetchConfiguration);
final String file = getfilepath(url);
request = new Request(url, file);
request.setPriority(Priority.HIGH);
request.setNetworkType(NetworkType.ALL);
MainActivity.this.fetch.enqueue(request, new Func<Request>() {
@Override
public void call(@NotNull Request result) {
Toast.makeText(MainActivity.this, "File is in Que", Toast.LENGTH_SHORT).show();
}
}, new Func<Error>() {
@Override
public void call(@NotNull Error result) {
Toast.makeText(MainActivity.this, "Whoops Error Occurred", Toast.LENGTH_SHORT).show();
}
});
}
});
}
@NonNull
public static String getfilepath(@NotNull final String string) {
final String fileName = getFileName(string);
final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/fetch/";
return (dir+fileName);
}
public static String getFileName (@NotNull final String string) {
final Uri uri = Uri.parse(string);
return uri.getLastPathSegment();
}
private void SetProgressView(@NotNull final Status status, final int progress) {
switch (status) {
case QUEUED: {
percentage.setText("IN QUE");
break;
}
case ADDED: {
percentage.setText("ADDED");
break;
}
case DOWNLOADING:
case COMPLETED: {
if (progress== -1){
percentage.setText("DOWNLOADING");
} else {
final String progresString = getResources().getString(R.string.percent_progress,progress);
percentage.setText(progresString);
}
break;
}
default:{
percentage.setText("Status Unknown");
}
}
}
private void ShowDownloadError(@NotNull Error error) {
Toast.makeText(this, error.toString(), Toast.LENGTH_SHORT).show();
}
private void UpdateView(@NotNull Download download, long eta, long speedKBPS, @Nullable Error error) {
SetProgressView(download.getStatus(),download.getProgress());
time.setText(Utils.getETA(this,eta));
speed.setText(Utils.getSpeed(this,speedKBPS));
if (error != null) {
ShowDownloadError(download.getError());
}
}
}
但该应用程序无法运行,它显示以下错误:
Process: google.test1, PID: 4975
java.lang.NullPointerException: Attempt to invoke interface method 'com.tonyodev.fetch2.Fetch com.tonyodev.fetch2.Fetch.addListener(com.tonyodev.fetch2.FetchListener)' on a null object reference
at google.test1.MainActivity$2.onClick(MainActivity.java:135)
at android.view.View.performClick(View.java:4781)
at android.view.View$PerformClick.run(View.java:19907)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:160)
at android.app.ActivityThread.main(ActivityThread.java:5541)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
其次,当我尝试从此链接下载文件时,它总是弹出错误并且由于监听器不在那里而无法知道原因:
链接:http://speedtest.ftp.otenet.gr/files/test100Mb.db
和来自logcat的错误:
Process: google.test1, PID: 4975
java.lang.NullPointerException: Attempt to invoke interface method 'com.tonyodev.fetch2.Fetch com.tonyodev.fetch2.Fetch.addListener(com.tonyodev.fetch2.FetchListener)' on a null object reference
at google.test1.MainActivity$2.onClick(MainActivity.java:135)
at android.view.View.performClick(View.java:4781)
at android.view.View$PerformClick.run(View.java:19907)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:160)
at android.app.ActivityThread.main(ActivityThread.java:5541)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
我正在使用最新版本的提取。
最佳答案
看来您没有正确初始化Fetch
对象。您试图使用该对象添加侦听器,但是您在侦听器内部进行了初始化。您必须在使用变量之前进行初始化。
public class MainActivity extends AppCompatActivity {
Fetch fetch;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
//You need to initialize the instance BEFORE you add the listener.
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this)
.setDownloadConcurrentLimit(3)
.build();
fetch = Fetch.Impl.getInstance(fetchConfiguration);
所有这些都位于您提供的link内的文档中。
关于java - 提取:如何添加监听器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52410550/