有以下代码:
package tanat.androidtesttask;
import android.app.DialogFragment;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainList extends ListFragment implements SwipeRefreshLayout.OnRefreshListener{
SwipeRefreshLayout mSwipeRefreshLayout;
ArrayList data;
DialogFragment dialogFragment;
//подключаем мой фрагмент
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_item, null);
dialogFragment = new MyDialog();
mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
mSwipeRefreshLayout.setOnRefreshListener(this);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
dialogFragment.show(getFragmentManager(), "");
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
data = new MainActivity().demo();
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
dialogFragment.dismiss();
// dialogFragment.show(getFragmentManager(), "");
// data = new MainActivity().demo();
//создаем лист фрагментов
super.onActivityCreated(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, data);
setListAdapter(adapter);
}
@Override
public void onStart() {
super.onStart();
}
//вешаем слушатель на нажатие фрагмента
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
//передаем позицию елемента в второе активити
//создаем интент
Intent intent = new Intent(MainList.this.getContext(), InfoRoutActivity.class);
//записываем в него ключ и позицию
intent.putExtra("position", position);
//передаем
startActivity(intent);
}
//свайп вниз для обновления
@Override
public void onRefresh() {
// говорим о том, что собираемся начать
Toast.makeText(getActivity(), "Обновляем", Toast.LENGTH_SHORT).show();
// начинаем показывать прогресс
mSwipeRefreshLayout.setRefreshing(true);
// ждем 3 секунды и прячем прогресс
mSwipeRefreshLayout.postDelayed(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(false);
// говорим о том, что собираемся закончить
Toast.makeText(getActivity(),"обновили", Toast.LENGTH_SHORT).show();
}
}, 3000);
}
}
这是片段类。当它被创建时,另一个片段被调用,它只是一个自定义的DialogFragment,就像一个进度对话框。和团队
data = new MainActivity().demo();
进入活动,从它到服务并加载 json,然后我们等到这个线程被执行并关闭进度对话框,然后我们从我们下载的数据中创建一个 ListFragment,至少按照预期,但是在这个命令上敲出以下错误
E/AndroidRuntime: FATAL EXCEPTION: Thread-130
Process: tanat.androidtesttask, PID: 1700
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.app.Activity.<init>(Activity.java:754)
at tanat.androidtesttask.MainActivity.<init>(MainActivity.java:0)
at tanat.androidtesttask.MainList$1.run(MainList.java:50)
at java.lang.Thread.run(Thread.java:818)
我已经尝试过使用 Handler 但我无法弄清楚在这种情况下如何正确使用它,我已经在互联网上翻找了 2 天但无济于事。请帮助提前谢谢。
因此,
Handler是一个用于与它所连接的流进行通信的接口。它将运行的线程作为参数(实际上是一个特殊的类对象Looper,有关 Handler 的文档)。该调用Handle handler = new Handler() {...}绑定Handler到当前线程。那些。对象的函数将在其创建上下文中执行。这意味着我们可以使用Handler.例如:
从示例中可以看出,我们创建了一个新线程(请注意,该类
HandlerThread已经具有Looper. 常规Thread的将没有它,您必须手动控制它的生命周期),接收对象Looper并声明Handler. 现在我们可以通过调用方法发送不同的消息或将其执行代码提供给线程getHandler。一个好的 android 初学者教程链接,官方指南,强烈推荐阅读我上面的评论和链接中的文章。